martinlin & borrisholt>>det er jo ikke rigtigt: 1: sortering er forkert 10 < 2 i jeres metode. 2: hvis ens tal så ens farve, fx 10 10 2, så blå, blå, sky-blå, og ingen hvid. Okay (jeg fik borrisholt tror jeg !)
Prøv det her (utestet) og jeg har ikke tid til at ghøre det
function doSort(List: TStringList; Index1, Index2: Integer): Integer; var a, b: Integer; begin a := StrToIntDef(List[Index1], -1); b := StrToIntDef(List[Index2], -1); if a < b then Result := -1 else Result := 1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var StringList: TStringList; begin StringList := TStringList.Create; StringList.AddObject(Edit1.Text, Edit1); StringList.AddObject(Edit2.Text, Edit2); StringList.AddObject(Edit3.Text, Edit3); StringList.CustomSort(doSort);
Her er noget der kan. Bemærk at farverne er ændret (Jeg har ikke SkyeBlue, og White kan man ikke se) (derfor Aqua og Silver) Indeholder 3 editbox'e og 1 button Editboxene skal oprettes først, ellers passer index ikke.
procedure TForm1.Button1Click(Sender: TObject); var tal: array [1..3] of double; inx: array [1..3] of integer;
procedure swap(i,j:integer); var temp1: double; temp2: integer; begin temp1 := tal[j]; {bytter om på tallene} tal[j] := tal[i]; tal[i] := temp1;
temp2 := inx[j]; {bytter om på index} inx[j] := inx[i]; inx[i] := temp2; end;
Procedure colorize(x: integer;col: TColor); begin if Controls[x-1] is TEdit then (Controls[x-1] as TEdit).Font.Color := col;
if tal[2]>tal[1] then swap(1,2); {undersøger rækkefølge} if tal[3]>tal[2] then begin swap(2,3); if tal[2]>tal[1] then swap(1,2); end;
If ((tal[1] = tal[2]) and (tal[1] = tal[3])) then {alle ens} begin colorize(inx[1],clBlue); colorize(inx[2],clBlue); colorize(inx[3],clBlue); end else If tal[1] = tal[2] then {2 første ens} begin colorize(inx[1],clBlue); colorize(inx[2],clBlue); colorize(inx[3],clAqua); end else If tal[2] = tal[3] then {2 sidste ens} begin colorize(inx[1],clBlue); colorize(inx[2],clAqua); colorize(inx[3],clAqua); end else {alle 3 forskellige} begin colorize(inx[1],clBlue); colorize(inx[2],clAqua); colorize(inx[3],clSilver); end; end;
hreiff>> Går du ALTID over åen efter vand, eller er det kun når du programmerer ? Hvad nu hvis der var 15 edit felter ?
Jeg har testet mit kode, og her er en løsning der virker :
function doSort(List: TStringList; Index1, Index2: Integer): Integer; var a, b: Integer; begin Result := 0; a := StrToIntDef(List[Index1], -1); b := StrToIntDef(List[Index2], -1);
if a > b then Result := 1 else if a < b then Result := -1; end;
procedure TForm1.Button1Click(Sender: TObject); var StringList: TStringList; begin StringList := TStringList.Create; StringList.AddObject(Edit1.Text, Edit1); StringList.AddObject(Edit2.Text, Edit2); StringList.AddObject(Edit3.Text, Edit3); StringList.CustomSort(doSort);
>> Jens Njææ, kun nogengange. Som regel prøver jeg bare etellerandet, så kan man altid optimere bagefter. Jeg er jo ikke bitpiller - Jeg programmerer bare lidt engang imellem for sjov (Og som regel er det beregninger / resultater jeg går efter). mvh. Henrik
>> hreiff Den copy-paste-løsning du lige leverede: synes du selv den kan virke som et paradigme i dette fora? Du fik i alt fald vækket bitpilleren i mig.
Jens' (og lidt martinlinds) løsning med at lave sin egen sorteringsrutine er meget bedre fordi han bruger de rigtige værktøjer.
Indrømmet, den med at han faktisk associerer en TEdit-instans (et rigtigt objekt, ikke en TObject(integer)) til tallene, er lidt nørdet og fordrer kendskab til TStrings-klassen - men for bitpillerne, er det netop det sjove.
Når så en bitpiller rigtigt går amok så ender det måske med noget lignende dette der gennemtravler en form for TEdits og ordner dem i pæne grønne nuancer.
Det er fredag og der er snart weekend...
function doSort(List: TStringList; Index1, Index2: Integer): Integer; var a, b: Integer; begin Result := 0; a := StrToIntDef(List[Index1], -1); b := StrToIntDef(List[Index2], -1);
if a > b then Result := 1 else if a < b then Result := -1; end;
procedure TForm1.Button1Click(Sender: TObject); var i : integer; ColorNo : integer; ColorJumps : integer; StringList: TStringList; begin StringList := TStringList.Create; try for i := 0 to Self.ComponentCount - 1 do if Components[i] is TEdit then StringList.AddObject((Components[i] as TEdit).Text,Components[i]);
StringList.CustomSort(doSort);
ColorJumps := $ff div StringList.Count;
ColorNo := $ff; for i := 0 to StringList.Count - 1 do begin dec(ColorNo,ColorJumps); TEdit(StringList.Objects[i]).Color := RGB(ColorNo,$ff,ColorNo); end; finally FreeAndNil(StringList); end; end;
Der var da ikke meget copy-paste i mit (bortset fra det med farvetildelingen) Og så kan jeg bedre lide at arbejde med tal end med strenge, så man undgår problemer med hvad der er størst (er 9.234E2 større end 2.345E4) (Martins og Jens' 1 forslag) Jens' 2 forslag er elegant, det vil jeg da gerne indrømme - Det havde jeg faktisk ikke kigget nærmere på inden jeg selv sad og legede. Jeg bruger nu også mest spørgsmålene til at prøve lidt hist og pist. Må man ikke være med, når man ikke er professionel ???
>> hreiff Jo, så skidt da, leg du bare med :-) Jeg vil bare gerne have, at de eksempler der lægges ud, er brugbare og lærerige for de som ser det.
Som mit lille Delphi-spin-off indikerer, så kan jeg godt lide rutiner der ikke behøver ændring om man f.eks. sætter flere TEdits på formen. Dit eksempel var det direkte modsatte; en lad-os-få-det-til-at-virke-hurtigst-muligt-løsning (kunne også kaldes projektlederfremgangsmåden).
Resultatet var, at jeg vågnede fra dvale (lidt ligesom Holger Danske) og svang mit litterære sværd over den formastelige.
I øvrigt: Mit eksempel giver også sammenfaldende værdier en forskellig nuance - og det er ikke korrekt - men det ser pænt ud med de grønne farver.
falster>> ja men jeg listede martinlind's og borrisholt's fejl, og der var 2!! Ellers godt nørdedet falster...he
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.