Текущий архив: 2002.06.20;
Скачать: CL | DM;
Вниз
Хай мастера! У меня вопрос по сортировке! Найти похожие ветки
← →
[BAD]Angel (2002-06-09 14:46) [0]Есть StringGrid с несколькими строками... надо отсортировать их по возрастанию и записать в INI файл. Как бы это сделать? Если можно то программным кодом! ;-) Очень надо, ГОРЮ!
Заранее спасибо!
← →
777 (2002-06-09 14:51) [1]ручками.
или из StringGrid в какойнибудь листбокс, который
имеет св-во сортировки а потом обратно
:)
← →
[BAD]Angel (2002-06-09 15:01) [2]
procedure TForm1.Sort;
var
buf, buf1: String;
begin
cfg:=tinifile.Create(extractfilepath(application.exename)+"lme.phb");
for i:=1 to num do begin
names[i]:=cfg.ReadString("Record "+inttostr(i), "name", "");
tel1[i]:=cfg.ReadString("Record "+inttostr(i), "tel1", "");
tel2[i]:=cfg.ReadString("Record "+inttostr(i), "tel2", "");
adress[i]:=cfg.ReadString("Record "+inttostr(i), "address", "");
email[i]:=cfg.ReadString("Record "+inttostr(i), "email", "");
birth[i]:=cfg.ReadString("Record "+inttostr(i), "birth", "");
end;
for j:=1 to num do begin
lst.Items.Add(names[j]+"[1]"+tel1[j]+"[2]"+tel2[j]+"[3]"+adress[j]+"[4]"+email[j]+"[5]"+birth[j]);
end;
lst.sorted:=true;
for i:=num-1 downto 0 do begin
buf:=lst.Items[i];
buf1:=copy(buf, 1, pos("[1]", buf)-1);
delete(buf, 1, pos("[1]", buf)+2);
cfg.WriteString("Record "+inttostr(i+1), "name", buf1);
buf1:=copy(buf, 1, pos("[2]", buf)-1);
delete(buf, 1, pos("[2]", buf)+2);
cfg.WriteString("Record "+inttostr(i+1), "tel1", buf1);
buf1:=copy(buf, 1, pos("[3]", buf)-1);
delete(buf, 1, pos("[3]", buf)+2);
cfg.WriteString("Record "+inttostr(i+1), "tel2", buf1);
buf1:=copy(buf, 1, pos("[4]", buf)-1);
delete(buf, 1, pos("[4]", buf)+2);
cfg.WriteString("Record "+inttostr(i+1), "address", buf1);
buf1:=copy(buf, 1, pos("[5]", buf)-1);
delete(buf, 1, pos("[5]", buf)+2);
cfg.WriteString("Record "+inttostr(i+1), "birth", buf1);
cfg.WriteString("Record "+inttostr(i+1), "birth", buf);
end;
end;
что-то не получается! Подскажите, в чем ошибка!!!
← →
jedi (2002-06-09 15:31) [3]procedure SortSG(var A: TStringGrid; ACol: Integer; Order: Byte);
var
Lo, Hi: Integer;
Mid : String;
T: TStringList;
begin
case Order of
0:
begin
Lo := 1;
Hi := A.RowCount - 1;
Mid := A.Cells[ACol, (Lo + Hi) div 2];
T := TStringList.Create;
try
repeat
while A.Cells[ACol, Lo] < Mid do Inc(Lo);
while A.Cells[ACol, Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T.Assign(A.Rows[Lo]);
A.Rows[Lo].Assign(A.Rows[Hi]);
A.Rows[Hi].Assign(T);
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(A, iLo, Hi, ACol, 0);
if Lo < iHi then QuickSort(A, Lo, iHi, ACol, 0);
finally
T.Free;
end;
end;
1:
begin
Lo := iLo;
Hi := iHi;
Mid := A.Cells[ACol, (Lo + Hi) div 2];
T := TStringList.Create;
try
repeat
while A.Cells[ACol, Lo] > Mid do Inc(Lo);
while A.Cells[ACol, Hi] < Mid do Dec(Hi);
if Lo <= Hi then
begin
T.Assign(A.Rows[Lo]);
A.Rows[Lo].Assign(A.Rows[Hi]);
A.Rows[Hi].Assign(T);
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(A, iLo, Hi, ACol, 1);
if Lo < iHi then QuickSort(A, Lo, iHi, ACol, 1);
finally
T.Free;
end;
end;
end;
end;
← →
[BAD]Angel (2002-06-09 15:45) [4]
[Error] Unit1.pas(76): Undeclared identifier: "iLo"
Это что? :-)
← →
[BAD]Angel (2002-06-09 15:48) [5]
[Error] Unit1.pas(76): Undeclared identifier: "QuickSort"
И еще кое что! ;-))
← →
jedi (2002-06-09 15:58) [6]Sorry, ya nemnojco izmenil protseduru cotoruiu ya izmenil 4tobi bilo ponyatnee, izna4alno iLo, iHi bili cac vhodnie parametri.
Cstati protsedura napisana na osnove primera iz deplhi:
$DELPHI\Demos\Threads\.
procedure SortSG(var A: TStringGrid; aCol: Integer; Order: Byte);
var
Lo, Hi, iLo, iHi: Integer;
Mid : String;
T: TStringList;
begin
iLo := 1;
iHi := A.RowCount - 1;
Lo := iLo;
Hi := iHi;
Mid := A.Cells[aCol, (Lo + Hi) div 2];
T := TStringList.Create;
try
repeat
case Order of
0:
begin
while A.Cells[aCol, Lo] < Mid do Inc(Lo);
while A.Cells[aCol, Hi] > Mid do Dec(Hi);
end;
1:
begin
while A.Cells[aCol, Lo] > Mid do Inc(Lo);
while A.Cells[aCol, Hi] < Mid do Dec(Hi);
end;
end;
if Lo <= Hi then
begin
T.Assign(A.Rows[Lo]);
A.Rows[Lo].Assign(A.Rows[Hi]);
A.Rows[Hi].Assign(T);
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
case Order of
0:
begin
if Hi > iLo then QuickSort(A, aCol, 0);
if Lo < iHi then QuickSort(A, aCol, 0);
end;
1:
begin
if Hi > iLo then QuickSort(A, aCol, 1);
if Lo < iHi then QuickSort(A, aCol, 1);
end;
end;
finally
T.Free;
end;
end;
← →
jedi (2002-06-09 16:02) [7]Eshe raz sorry;-).
vot finalnii variant:
----------------------------------------------------------------
procedure SortSG(var A: TStringGrid; aCol: Integer; Order: Byte);
var
Lo, Hi, iLo, iHi: Integer;
Mid : String;
T: TStringList;
begin
iLo := 1;
iHi := A.RowCount - 1;
Lo := iLo;
Hi := iHi;
Mid := A.Cells[aCol, (Lo + Hi) div 2];
T := TStringList.Create;
try
repeat
case Order of
0:
begin
while A.Cells[aCol, Lo] < Mid do Inc(Lo);
while A.Cells[aCol, Hi] > Mid do Dec(Hi);
end;
1:
begin
while A.Cells[aCol, Lo] > Mid do Inc(Lo);
while A.Cells[aCol, Hi] < Mid do Dec(Hi);
end;
end;
if Lo <= Hi then
begin
T.Assign(A.Rows[Lo]);
A.Rows[Lo].Assign(A.Rows[Hi]);
A.Rows[Hi].Assign(T);
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
case Order of
0:
begin
if Hi > iLo then SortSG(A, aCol, 0);
if Lo < iHi then SortSG(A, aCol, 0);
end;
1:
begin
if Hi > iLo then SortSG(A, aCol, 1);
if Lo < iHi then SortSG(A, aCol, 1);
end;
end;
finally
T.Free;
end;
end;
← →
[BAD]Angel (2002-06-09 16:07) [8]Спасибо!
← →
jedi (2002-06-09 17:26) [9]Vse taki pravilnee budet tak:
procedure SortSG(var A: TStringGrid; iLo, iHi, aCol: Integer; Order: Byte);
var
Lo, Hi: Integer;
Mid : String;
T: TStringList;
begin
case Order of
0:
begin
Lo := iLo;
Hi := iHi;
Mid := A.Cells[aCol, (Lo + Hi) div 2];
T := TStringList.Create;
try
repeat
while A.Cells[aCol, Lo] < Mid do Inc(Lo);
while A.Cells[aCol, Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T.Assign(A.Rows[Lo]);
A.Rows[Lo].Assign(A.Rows[Hi]);
A.Rows[Hi].Assign(T);
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then SortSG(A, iLo, Hi, aCol, 0);
if Lo < iHi then SortSG(A, Lo, iHi, aCol, 0);
finally
T.Free;
end;
end;
1:
begin
Lo := iLo;
Hi := iHi;
Mid := A.Cells[aCol, (Lo + Hi) div 2];
T := TStringList.Create;
try
repeat
while A.Cells[aCol, Lo] > Mid do Inc(Lo);
while A.Cells[aCol, Hi] < Mid do Dec(Hi);
if Lo <= Hi then
begin
T.Assign(A.Rows[Lo]);
A.Rows[Lo].Assign(A.Rows[Hi]);
A.Rows[Hi].Assign(T);
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then SortSG(A, iLo, Hi, aCol, 1);
if Lo < iHi then SortSG(A, Lo, iHi, aCol, 1);
finally
T.Free;
end;
end;
end;
end;
← →
jedi (2002-06-09 17:30) [10]primer vizova:
SortSG(SG, 1, SG.RowCount - 1, Col, 0); sortirovca po vozrostaniu
SortSG(SG, 1, SG.RowCount - 1, Col, 1); sortirovca po ubivaniu
← →
[BAD]Angel (2002-06-10 14:48) [11]Спасибо!
Страницы: 1 вся ветка
Текущий архив: 2002.06.20;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.004 c