powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пояснить код
3 сообщений из 3, страница 1 из 1
пояснить код
    #39587846
elimpion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите что выполняет данные код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
1)iTmp := PosEx(#9, strTemp, p);
2) Cells[k - 1, i - 1] := Copy(strTemp, p, iTmp - p);
3)     p := iTmp + 1;
4)    While (p <= Length(strTemp)) And (strTemp[p] = #9) Do
5) SlSort.AddObject(StringGrid1.Cells[aCol, i], SlRow);
6) SlRow := Pointer(SlSort.Objects[j]);
7)    StringGrid1.Rows[i].Assign(SlRow);


Вот полный код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, StrUtils, Math;

type
  TForm2 = class(TForm)
    StringGrid1: TStringGrid;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Process: TButton;
    Open: TButton;
    procedure ProcessClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure OpenClick(Sender: TObject);
  private
    slFile: TStringList; // Объявляем СтрингЛист
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
  f: TextFile; // обяъвляем переменные
  iTmp, i, k, p: Integer;
  strTemp: String;
begin
  AssignFile(f, FileName); // Связь между файловой переменной и файлом
  Reset(f); // открываем файл для чтения
  with StringGrid do // используем   with   do для упрощения записи
  begin
    i := 0; // переменной i присваиваем 0
    While Not Eof(f) do // используем цикл покуда не будет достигнут конец файла
    begin
      Readln(f, strTemp); // считываем количество столбоцов
      Inc(i); // увеличиавем I На 1
      RowCount := i; // количеству строк стринглиста присваиваем I

      strTemp := strTemp + #9; // разделяем strTemp символом табуляции
      p := 1;
      k := 0;
      While True do // пока выполняется условие будет идти цикл
      begin
        iTmp := PosEx(#9, strTemp, p);
        if iTmp = 0 then // если    iTmp = 0 тогда
          Break; // выходим из цикла
        Inc(k); // увеличиавем k На 1
        If (i = 1) Or (ColCount < k) Then // если i=1 или  количество сталбцов стринггрида <k тогда
          ColCount := k; // количество сталбцов стринггрида присваиваем k

        Cells[k - 1, i - 1] := Copy(strTemp, p, iTmp - p);
        p := iTmp + 1;
        While (p <= Length(strTemp)) And (strTemp[p] = #9) Do
          Inc(p); // увеличиавем p На 1
      end;
    end;
  end;
  CloseFile(f); // закрываем файл
end;

// Функция сортировки стринглиста по правилам сортировки чисел
function DigitSort(L: TStringList; index1, index2: Integer): Integer;
var
  i1, i2: Integer;
begin
  i1 := StrToInt(Copy(L.Strings[index1], 1, Pos(#9, L.Strings[index1]) - 1));
  i2 := StrToInt(Copy(L.Strings[index2], 1, Pos(#9, L.Strings[index2]) - 1));
  result := CompareValue(i1, i2);
end;

procedure TForm2.OpenClick(Sender: TObject);
var
  SlSort, SlRow: TStringList;
  i, j, aCol: Integer; // обяъявлеям переменные
begin
  begin
    If OpenDialog1.Execute Then // если файл выбран тогда
      LoadStringGrid(StringGrid1, OpenDialog1.FileName); // открываем файл
  end;
  begin
    aCol := StringGrid1.FixedCols; // aCol присаваиавем количество сталбцов

    SlSort := TStringList.Create; // создаем стринглист
    for i := StringGrid1.FixedRows to StringGrid1.RowCount - 1 do
    // проводим цикл
      SlRow := TStringList.Create; // создем стринглист
    SlRow.Assign(StringGrid1.Rows[i]); // копируем строку таблицы
    SlSort.AddObject(StringGrid1.Cells[aCol, i], SlRow);
  end;
  SlSort.Sort; // производим сортировку
  j := 0;
  for i := StringGrid1.FixedRows to StringGrid1.RowCount - 1 do // проводим цикл
  begin
    SlRow := Pointer(SlSort.Objects[j]);
    StringGrid1.Rows[i].Assign(SlRow);
    SlRow.Free; // уничтожаем SlRow
    Inc(j);
  end;
  SlSort.Free;   //уничтожем  SlSort
end;


procedure TForm2.ProcessClick(Sender: TObject);
var
  fName: String; // переменная, куда записываем имя файла
  dL, sL: TStringList; // объявляем стринглисты
  i, tmp: Integer;
begin
  if not OpenDialog1.Execute then // если никакой файл не выбран - прерываем выполнение
    Exit;
  slFile.LoadFromFile(OpenDialog1.FileName); // загружаем файл в стринглист
  StringGrid1.RowCount := slFile.Count; // количество строк в таблице = количеству строк в файле
  dL := TStringList.Create;
  for i := 0 to slFile.Count - 1 do // проходим по строкам стринглиста
  begin
    dL.Delimiter := #9; // устанавливаем разделить строк, рязделяемый символом табуляции(#9)
    dL.DelimitedText := slFile.Strings[i]; // разделяем строку на слова и заполняем стринглист
    if dL.Count > StringGrid1.ColCount then // если количество строк в  больше, чем количество столбцов таблицы
      StringGrid1.ColCount := dL.Count; // тогда количество столбцов таблицы = количеству строк
    StringGrid1.Rows[i].DelimitedText := slFile.Strings[i]; // заполняем очередную строку таблицы очередной строкой, разбив ее на слова
  end;
  dL.Clear; // очищаем стринглист
  fName := ChangeFileExt(OpenDialog1.FileName, '.result');
  // задаем файлу новое расширение
  sL := TStringList.Create; // создем стринглист
  for i := 0 to StringGrid1.RowCount - 1 do
  // циклом проходим по строкам таблицы
  begin
    StringGrid1.Rows[i].Delimiter := #9; // устанавливаем разделитель строк равный символу табуляции
    if TryStrToInt(StringGrid1.Cells[0, i], tmp) then // если данные из первой ячейки текущей строки являются целым числом
      dL.Add(StringGrid1.Rows[i].DelimitedText)
      // тогда записываем эту строку таблицу дл
    else
      sL.Add(StringGrid1.Rows[i].DelimitedText); // иначе записывем в сл
  end;
  if sL.Count > 1 then // если в сл больше одной строки тогда сортируем её по правилам сортировки строк
    sL.Sort;
  if dL.Count > 1 then // если в дл больше одной строки тогда сортируем по правилам сортировки чисел
    dL.CustomSort(DigitSort);
  slFile.Text := dL.Text; // текст slFile=dL
  for i := 0 to sL.Count - 1 do // циклам проходим по сл
    slFile.Add(sL.Strings[i]); // добовляем строку в  slFile
  if not FileExists(fName) then // если нет файла, имя которого определено переменной fName
    slFile.SaveToFile(fName) // тогда сохраняем в файл с именем fName
  else if (MessageBox(Handle, // иначе открывается диалоговое окно с предложение записть под другим именем
      'Обработанный файл с таким именем уже существует.'#13'Вы хотите сохранить файл под другим именем?', 'Запрос.', mb_YesNo or mb_IconQuestion) = idNo) or (not SaveDialog1.Execute) then
  begin
    ShowMessage('Операция отменена. Файл не сохранен!'); // в случаем не согласия сохранить файл с другим именем выводим сообщение на экран
    Exit; // прерываем выполнение
  end
  else
    slFile.SaveToFile(SaveDialog1.FileName);
  // иначе сохраняем файл с новым именем
  ShowMessage('Сохранение выполнено успешно!');
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  slFile := TStringList.Create; // создаем стринг лист
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  slFile.Free; // уничтожаем slFile и освобождаем память
end;

end.
...
Рейтинг: 0 / 0
пояснить код
    #39587850
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)iTmp := PosEx(#9, strTemp, p); / ищет символ #9 в строке strTemp начиная с позиции P.
2) Cells[k - 1, i - 1] := Copy(strTemp, p, iTmp - p); / в ячейку вставляется часть строки strTemp, начиная с позиции p длиной iTmp - p
3) p := iTmp + 1; / что обьяснять тут?
4) While (p <= Length(strTemp)) And (strTemp[p] = #9) Do цикл с условиями 1) пока позиция меньше длины строки 2) пока символ в строке на позиции p равен #9
5) SlSort.AddObject(StringGrid1.Cells[aCol, i], SlRow); / добавляем в стринглист строку и указатель на другой стринглист
6) SlRow := Pointer(SlSort.Objects[j]); / достаем этот указатель
8) StringGrid1.Rows[i].Assign(SlRow); - надо смотреть, что делает Assgn для Row - подозреваю что раскидывает по строке в каждую ячейку.


лаб с универа запах чую я в этом треде.
...
Рейтинг: 0 / 0
пояснить код
    #39587960
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
elimpionЗдравствуйте, подскажите что выполняет данные код
Код: pascal
1.
2.
3.
4.
1)iTmp := PosEx(#9, strTemp, p);
2) Cells[k - 1, i - 1] := Copy(strTemp, p, iTmp - p);
3)     p := iTmp + 1;
4)    While (p <= Length(strTemp)) And (strTemp[p] = #9) Do


Разбивает строку из файла на куски, разделённые символами табуляции, и распихивает эти значения по ячейкам. При этом зачем-то грохает пустые значения, неоправданно задвигая следующие левее чем нужно.

elimpionЗдравствуйте, подскажите что выполняет данные код
Код: pascal
1.
2.
3.
5) SlSort.AddObject(StringGrid1.Cells[aCol, i], SlRow);
6) SlRow := Pointer(SlSort.Objects[j]);
7)    StringGrid1.Rows[i].Assign(SlRow);


Лень детально разбираться, но там же вроде русским языком написано про сортировку. В целом, я так понимаю, запихивает строчку грида в строку + Objects стринглиста, сортирует стринглист, а потом заново заполняет грид из стринглиста уже отсортированными строчками.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пояснить код
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]