|
пояснить код
#39587846
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Здравствуйте, подскажите что выполняет данные код
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);
Вот полный код
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.
|
|
|