Werte aus verschiedenen Edits sortieren?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Werte aus verschiedenen Edits sortieren?

Beitrag von Foxi1896 »

Hey,

Also nehmen wir an ich habe die Werte:

Edit1:12 Edit2:15 Edit3:16 Edit4:10 Edit5:12,5 Edit6:13,1 Edit7:18 in je einem Edit stehen
dann möchte ich das sie beim kleinsten angefangen in den Edit angezeigt werden. Aber ihre Reihenfolge beibehalten.

Edit110 Edit112,5 Edit113,1 Edit118 Edit112 Edit115 Edit116

Ist das möglich so?

Code: Alles auswählen

 begin
 inc(n_wert);
 if n_wert=1 then Edit3.Text:= FormatFloat('0.00',y_wert);
 if n_wert=2 then Edit4.Text:= FormatFloat('0.00',y_wert);
 if n_wert=3 then Edit5.Text:= FormatFloat('0.00',y_wert);
 if n_wert=4 then Edit6.Text:= FormatFloat('0.00',y_wert);
 if n_wert=5 then Edit7.Text:= FormatFloat('0.00',y_wert);
 if n_wert=6 then Edit8.Text:= FormatFloat('0.00',y_wert);
 if n_wert=7 then Edit9.Text:= FormatFloat('0.00',y_wert);
 if n_wert=8 then Edit10.Text:=FormatFloat('0.00',y_wert);
 if n_wert=9 then Edit15.Text:=FormatFloat('0.00',y_wert);
 if n_wert=9 then
 

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Michl »

Natürlich ist das möglich, die Frage sollte lauten, ob dieses Vorgehen sinnvoll ist?!

Praktikabler ist meistens, wenn gleiche Werte in vielen Editfeldern stehen, anstatt diese zu sortieren, deine Abfrage in ein Stringgrid zu packen. Diese hat auch schon von Haus aus Sortierfunktionen!

Ansonsten eine Schleife:
- den jeweils größten bzw. kleinsten Wert abfragen
- diesen Wert in das gewünschte Edit schreiben
- diesen Wert als "geschrieben" markieren (evtl. extra Array zum markieren der Werte), damit er nicht nochmal genommen wird
- wieder von vorn

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Foxi1896 »

hmm.. aber dann wären alle Werte sortiert oder?

ich möchte das nur die Reihe mit dem kleinsten anfängt aber der rest bebehalten wird.

12 / 15 / 16 / 10 / 12,5 / 13,1 / 18 => 10 / 12,5 / 13,1 / 18 / 12 / 15 / 16

kannst mir ungefähr nen code schreiben wie es auszusehen hat?
wenn ich es mit stinggrid mache? oder Array?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Michl »

Da muss man ja 10mal hinschauen, um zu verstehen, was du willst. Ich glaube, ich habs jetzt verstanden:

Du willst, dass die Reihe mit dem Kleinsten anfängt, alle davor stehende Werte gelöscht und nachfolgende angezeigt werden?!

Ich kenne deine Datenbasis nicht, daher:
- per Schleife den kleinsten Wert suchen
- ab diesen Wert die nachfolgende Werte in deine Edits oder in Stringgrid

Als Beispiel, füge einen Button und ein Stringgrid in deine Form ein und teste mal ob es so sein soll:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  i,id:integer;
  Daten: array of real;
begin
  setlength(Daten, 20);
  stringgrid1.ColCount:=2;
  stringgrid1.rowCount:=20;
  stringgrid1.Clean;
  stringgrid1.FixedCols:=0;
  stringgrid1.FixedRows:=0;
 
  for i:=0 to high(Daten) do begin   //Stringgrid mit Zufallszahlen in der ersten Spalte füllen
    Daten[i]:=random(10000)/100;
    stringgrid1.Cells[0,i]:=floattostr(Daten[i]);
  end;
 
  id:=0;                             //ersten Wert zum Vergleich hernehmen
  for i:=1 to high(Daten) do
    if Daten[i]<Daten[id] then id:=i;//Wert ist kleiner, als der zuvor untersuchte, daher diesen jetzt nehmen
 
  for i:=id to high(daten) do        //Daten ab dem kleinsten Wert anzeigen
    stringgrid1.Cells[1,i-id]:=floattostr(Daten[i]);
end;           
Ist kein Hexenwerk - just try it - Lazarus beisst nicht!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Foxi1896 »

Fast... nur die Werte die davorstehen sollen hinten dran gehängt werden in ihrer Reihenfolge.

2 , 3 , 8 , 10 , 1 , 4 , 6 , 8 , 10
wird zu
1 , 4 , 6 , 8 , 10 , 2 , 3 , 8 , 10
Zuletzt geändert von Foxi1896 am Di 2. Jul 2013, 09:47, insgesamt 2-mal geändert.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Michl »

Dann schreib sie doch einfach noch dahinter! Wobei der komplette Code dann so aussieht:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  i,id:integer;
  Daten: array of real;
begin
  setlength(Daten,20);               //Die Anzahl der Werte können beliebig verändert werden
  stringgrid1.ColCount:=2;
  stringgrid1.rowCount:=length(Daten);
  stringgrid1.Clean;
  stringgrid1.FixedCols:=0;
  stringgrid1.FixedRows:=0;
 
  for i:=0 to high(Daten) do begin   //Stringgrid mit Zufallszahlen in der ersten Spalte füllen
    Daten[i]:=random(10000)/100;
    stringgrid1.Cells[0,i]:=floattostr(Daten[i]);
  end;
 
  id:=0;                             //ersten Wert zum Vergleich hernehmen
  for i:=1 to high(Daten) do
    if Daten[i]<Daten[id] then id:=i;//Wert ist kleiner, als der zuvor untersuchte, daher diesen jetzt nehmen
 
  for i:=id to high(daten) do        //Daten ab dem kleinsten Wert anzeigen
    stringgrid1.Cells[1,i-id]:=floattostr(Daten[i]);
 
  for i:=0 to id-1 do                //vorherigen Daten dahinter
    stringgrid1.Cells[1,length(daten)-id+i]:=floattostr(Daten[i]);
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Foxi1896 »

habe jetzt ein Stringgrid. Wie mach ich das wenn ich kein high(Data) habe? (bzw. keine Zufallszahlen)

Code: Alles auswählen

if n_wert=1 then stringgrid1.cells[0,1]:= FormatFloat('0.00',y_wert);
 if n_wert=2 then stringgrid1.cells[1,1]:= FormatFloat('0.00',y_wert);
 if n_wert=3 then stringgrid1.cells[2,1]:= FormatFloat('0.00',y_wert);
 if n_wert=4 then stringgrid1.cells[3,1]:= FormatFloat('0.00',y_wert);
 if n_wert=5 then stringgrid1.cells[4,1]:= FormatFloat('0.00',y_wert);
 if n_wert=6 then stringgrid1.cells[5,1]:= FormatFloat('0.00',y_wert);
 if n_wert=7 then stringgrid1.cells[6,1]:= FormatFloat('0.00',y_wert);
 if n_wert=8 then stringgrid1.cells[7,1]:= FormatFloat('0.00',y_wert);
 if n_wert=9 then stringgrid1.cells[8,1]:= FormatFloat('0.00',y_wert);
 if n_wert=9 then     

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Michl »

Ich glaube, dir fehlen da noch ein paar grundlegende Kenntnisse.

high(Data) bedeutet nichts anderes als wenn du z.B. 20 Datensätze hast (bei einem array of..) die 19! Google mal "high(), low(), length() ...", da findest du genug Erklärungen, auf jeden Fall bessere, als ich sie dir jetzt geben kann.
In deinem Fall hast du ja sowas wie einen Zähler (n_wert), den du dann genauso verwenden kannst. Also, ist dein n_wert maximal 9, dann ist high(Data)=9, also könntest du auch gleich 9 schreiben! Achtung, wenn n_wert minimal 1 ist, kann deine Schleife auch erst bei 1 anfangen!

z.B. for i:=1 to 9 do... (bei n_wert(min)=1 und n_wert(max)=9)

PS. statt

Code: Alles auswählen

if n_wert=1 then stringgrid1.cells[0,1]:= FormatFloat('0.00',y_wert);
 if n_wert=2 then stringgrid1.cells[1,1]:= FormatFloat('0.00',y_wert);
 if n_wert=3 then stringgrid1.cells[2,1]:= FormatFloat('0.00',y_wert);
 if n_wert=4 then stringgrid1.cells[3,1]:= FormatFloat('0.00',y_wert);
 if n_wert=5 then stringgrid1.cells[4,1]:= FormatFloat('0.00',y_wert);
 if n_wert=6 then stringgrid1.cells[5,1]:= FormatFloat('0.00',y_wert);
 if n_wert=7 then stringgrid1.cells[6,1]:= FormatFloat('0.00',y_wert);
 if n_wert=8 then stringgrid1.cells[7,1]:= FormatFloat('0.00',y_wert);
 if n_wert=9 then stringgrid1.cells[8,1]:= FormatFloat('0.00',y_wert);
 if n_wert=9 then   
könntest du auch

Code: Alles auswählen

stringgrid1.cells[n_wert-1,1]:= FormatFloat('0.00',y_wert);
schreiben, da sparst du dir die komplette "if" Abfrage und der Compiler macht nichts anderes!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Foxi1896 »

Also das mit der If Abfrage kürzen hab ich gemacht, funktioniert auch prima.

Aber sobald ich das andere Versuche kommt immer wieder die Meldung ( das Reihen bzw Zeilen Anzahl nicht stimmen)
Du hast es ja so geschrieben das die Werte Untereinander angezeigt werden.
Da ich es alles in einer Zeile anzeigen lasse muss ich ja nur x und y vertauschen in den Klammern aber torzdem immer wieder Fehler.

Code: Alles auswählen

y_wert:=StrToFloat2(inW);
stringgrid1.cells[0,0]:=inW;
stringgrid1.cells[1,0]:=IntToStr(i);
stringgrid1.cells[2,0]:=FormatFloat('0.00',y_wert);
 
if y_wert > 0.1 then
 begin
 
 KWA :=StrToInt(Edit11.Text);
 
setlength(Daten,20);
stringgrid1.ColCount:=KWA+2;
stringgrid1.rowCount:=2;
stringgrid1.FixedCols:=0;
stringgrid1.FixedRows:=0;
 
 inc(n_wert);
 stringgrid1.cells[n_wert-1,1]:= FormatFloat('0.00',y_wert);
 end;
 
 
begin
 
 
  for i:=0 to high(Daten) do
      begin
          stringgrid1.Cells[i,0]:=floattostr(Daten[i]);
      end;
 
 id:=0;
 
 for i:=1 to high(Daten) do
     if Daten[i]<Daten[id] then id:=i;
 
 for i:=id to high(daten) do
     stringgrid1.Cells[i-id,1]:=floattostr(Daten[i]);
 
 for i:=0 to id-1 do
     stringgrid1.Cells[length(daten)-id+i,1]:=floattostr(Daten[i]);
 
 end;
 
Zuletzt geändert von Foxi1896 am Di 2. Jul 2013, 11:27, insgesamt 1-mal geändert.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Michl »

Dann poste doch den Code (wo der Fehler liegt), damit wir nicht immer nur ins blaue raten müssen!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Foxi1896 »

ah 2 sec zu langsam eingefügt:

Code: Alles auswählen

y_wert:=StrToFloat2(inW);
stringgrid1.cells[0,0]:=inW;
stringgrid1.cells[1,0]:=IntToStr(i);
stringgrid1.cells[2,0]:=FormatFloat('0.00',y_wert);
 
if y_wert > 0.1 then
 begin
 
 KWA :=StrToInt(Edit11.Text);
 
setlength(Daten,20);
stringgrid1.ColCount:=KWA+2;
stringgrid1.rowCount:=2;
stringgrid1.FixedCols:=0;
stringgrid1.FixedRows:=0;
 
 inc(n_wert);
 stringgrid1.cells[n_wert-1,1]:= FormatFloat('0.00',y_wert);
 end;
 
 
begin
 
 
  for i:=0 to high(Daten) do
      begin
          stringgrid1.Cells[i,0]:=floattostr(Daten[i]);
      end;
 
 id:=0;
 
 for i:=1 to high(Daten) do
     if Daten[i]<Daten[id] then id:=i;
 
 for i:=id to high(daten) do
     stringgrid1.Cells[i-id,1]:=floattostr(Daten[i]);
 
 for i:=0 to id-1 do
     stringgrid1.Cells[length(daten)-id+i,1]:=floattostr(Daten[i]);
 
 end;
 

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Michl »

versuchs mal so:

Code: Alles auswählen

  y_wert:=StrToFloat2(inW);
//  stringgrid1.cells[0,0]:=inW;
//  stringgrid1.cells[1,0]:=IntToStr(i);
//  stringgrid1.cells[2,0]:=FormatFloat('0.00',y_wert);
 
  if y_wert > 0.1 then begin
    KWA :=StrToInt(Edit11.Text);
 
    // setlength(Daten,20);         //Daten brauchst du nicht, hast ja eigene!!!
    stringgrid1.ColCount:=KWA+2;    //Aha, deine DatenMenge ist also KWA+1
    stringgrid1.rowCount:=3;
    stringgrid1.FixedCols:=0;
    stringgrid1.FixedRows:=0;
 
    inc(n_wert);
    stringgrid1.cells[n_wert-1,1]:= FormatFloat('0.00',y_wert);
 
    id:=0;
    for i:=0 to KWA+1 do            //KWA+1 ist deine Datenmenge, entspricht also high(Daten) von mir!
      if strtofloat(stringgrid1.Cells[i,1])<strtofloat(stringgrid1.Cells[id,1]) then id:=i;
 
    for i:=id to KWA+1 do
      stringgrid1.Cells[i-id,2]:=stringgrid1.Cells[i,1];
 
    for i:=0 to id-1 do
      stringgrid1.Cells[KWA+2-id+i,2]:=stringgrid1.Cells[i,1];
  end;
 
wobei man

Code: Alles auswählen

    stringgrid1.ColCount:=KWA+2;    //Aha, deine DatenMenge ist also KWA+1
    stringgrid1.rowCount:=3;
    stringgrid1.FixedCols:=0;
    stringgrid1.FixedRows:=0; 
eigentlich nicht bei jedem Aufruf setzt, sondern dies zuvor definiert z.B. bei onFormCreate oder beim Objektinspektor oder wenn sich deine Datenmenge ändert...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Werte aus verschiedenen Edits sortieren?

Beitrag von Foxi1896 »

DANKESCHÖN!!! Es funktioniert ... hoffentlich bekomme ich den Rest jetzt auch so hin.

KWA habe ich auf +2 weil am Ende noch ein Wert kommt der nicht mit in die Reihenfolge eingetragen werden soll. Hatte es erst auch im Objektinspektor eingestellt aber am Ende möchte ich mal 8 oder 12 oder ... Werte aufnehmen und das am Anfang bestimmen können.

Antworten