Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Nach ABC ordnen (https://www.delphipraxis.net/40898-nach-abc-ordnen.html)

ferby 22. Feb 2005 23:05

Datenbank: - • Version: - • Zugriff über: -

Nach ABC ordnen
 
Hallo,

Ich habe 99 Labels mit Namen untereinander.
Ich möchte das diese Labels nach dem ABC sotiert werden.
Es müssen die Labels + inhalt sotiert werden, nicht deren Inhalt!
Die Labels sind durchnummeriert von
Label1
Label2
Label3
.
.
.
.
Label99


Wie mach ich das?

Wenn Label1.caption:='Bertl' und label2.caption:='Anton' dann möchte ich nicht das Label1.caption:='Anton' ist und Label2.caption:='Bertl' sondern
das die beiden label die positionen ändern.....


kann mir wer weiterhelfen?
danke!

Nikolas 22. Feb 2005 23:13

Re: Nach ABC ordnen
 
Schreib dir alle Namen in eine Stringlist. Dadurch hast du eine eineindeutige Zuordnung zwischen Namen und Nummern (falls es keine doppelten Namen gibt). Jetzt nimmst du eine andere Stringlist, setzt sorted auf true und füllst sie mit allen Namen. Jetzt gehst du die durch, nimmst dir einen Namen schaust in der ersten Liste nach dem passenden Label und setzt es an die passende Stelle auf dem Form und du bist fertig.

Luckie 22. Feb 2005 23:17

Re: Nach ABC ordnen
 
Das steht bei Datenbanken, steht eine Datenbank da hinter? Dann würde ich datensensitive DBLabels nehmen und das Eintragen der Abfrage überlassen, wie es sich auch gehört.

Sharky 23. Feb 2005 07:49

Re: Nach ABC ordnen
 
Hai ferby,

irgendwie verstehe ich denn Sinn der Aktion nicht :gruebel:. Warum ist es denn wichtig das ein Label an einer bestimmten Position steht?


Zitat:

Zitat von Luckie
... Dann würde ich datensensitive DBLabels nehmen und das Eintragen der Abfrage überlassen, wie es sich auch gehört.

Hai Luckie,
das würde in diesem Fall sicher nichts nutzen. Ein DBLabel bekommt seinen Inhalt ja von einer TDataSource. Und diese gibt immer nur den aktiven Datansatz einer Tabelle wieder. Es würde also in allen DBLables der selbe Inhalt stehen.

Jasocul 23. Feb 2005 08:08

Re: Nach ABC ordnen
 
Zitat:

Zitat von Sharky
irgendwie verstehe ich denn Sinn der Aktion nicht :gruebel:. Warum ist es denn wichtig das ein Label an einer bestimmten Position steht?

Solche Probleme gibt es wirklich. Ich habe sowas mit Buttons gehabt. Aber die Sortierung habe ich dabei schon im SQL-Statement eingebaut (Stichwort order by).

Als ferby, TQuery verwenden und eine "order by" benutzen.

Luckie 23. Feb 2005 08:16

Re: Nach ABC ordnen
 
Zitat:

Zitat von Sharky
Ein DBLabel bekommt seinen Inhalt ja von einer TDataSource. Und diese gibt immer nur den aktiven Datansatz einer Tabelle wieder. Es würde also in allen DBLables der selbe Inhalt stehen.

Wieder was gelernt. Dann geht es so eben nicht.

Zitat:

Zitat von Jasocul
Aber die Sortierung habe ich dabei schon im SQL-Statement eingebaut (Stichwort order by).

Aber an so was hatte ich gedacht. Denn grundsätzlich gilt bei Datenbankanwendungen, dass das Aufbereiten der Dtaen die Datenbank erledigt. Die visuellen Elemente auf dem Fenster dienen nur der Darstellung der Daten. (Ich hoffe, das ist korrekt. ;) )

Und bei 99 Labels stellt sich die Frage, ob man nicht besser eine Tabelle (Listview, StringGrid) oder eine Liste (ListBox) nimmt. Ich wäre schon zu faul diese 99 Labels auf der Form zu plazieren. :?

alcaeus 23. Feb 2005 08:18

Re: Nach ABC ordnen
 
Allgemein ist es irgendwie daneben, Labels für die Anzeige zu verwenden, und die Labels dann rumzuschieben. Da würde ich wohl eher mit einem "blinden" Memo arbeiten (also ein Memo welches disabled ist, keinen Rand, etc., damit es nicht wie ein Memo aussieht). Dann kannst du die Elemente auch gleich sortieren.

Greetz
alcaeus

Luckie 23. Feb 2005 08:20

Re: Nach ABC ordnen
 
Zitat:

Zitat von alcaeus
Da würde ich wohl eher mit einem "blinden" Memo arbeiten (also ein Memo welches disabled ist, keinen Rand, etc., damit es nicht wie ein Memo aussieht). Dann kannst du die Elemente auch gleich sortieren.

Das würde ich aber auch nicht für eine sehr gelungene Darstellungsform halten.

alcaeus 23. Feb 2005 08:27

Re: Nach ABC ordnen
 
Zitat:

Zitat von Luckie
das würd eich aber auch nicht für eine sehr gelungene Darstellungsform halten.

Ja, das Memo vielleicht nicht, aber wie du schon erwähnt hast, eine Listbox oder so wäre besser. Ein Memo wäre jedenfalls schon mal ein Schritt in die richtige Richtung ;)

Greetz
alcaeus

Jasocul 23. Feb 2005 08:36

Re: Nach ABC ordnen
 
Und was soll er machen, wenn er so seine Sprach-Steuerung macht?
OK, dann braucht man sicher nicht sortieren. Ich wollte nur aufzeigen, dass es Fälle gibt, wo man etwas so löst.
Bei meinen Buttons geht es zum Beispiel darum, eine schnelle Artikelauswahl zu ermöglichen. Dafür genügen drei Randbedingungen. Zwei davon werden über Button dargestellt. Diese erzeuge ich allerdings dynamisch, da ich vorher nicht mal weiß, wie viele erforderlich sind.
Das hätte auch mit ComboBox gelöst werden. Da dauert die Auswahl aber länger. Beim Verkauf am Telefon ein echter Unterschied.

ferby 25. Feb 2005 18:35

Re: Nach ABC ordnen
 
Hallo,

warum ich die Labels tauschen muss ist kompliziert....

ich habe mir was geschrieben was für mich eigentlich gehen müsste nur irgendwie geht es nicht???

Delphi-Quellcode:
procedure TDatenbank.button_abcClick(Sender: TObject);
var
i,i2,z:integer;
begin
  for i:=1 to speicher do for i2:=speicher downto i do
  if hauptnamelabels[i2].caption>hauptnamelabels[i2+1].caption then
  begin
    z:=hauptnamelabels[i2+1].top;
    hauptnamelabels[i2+1].top:=hauptnamelabels[i2].top;
    hauptnamelabels[i2].top:=z;
  end;

end;
speicher ist die anzahl der labels.............
hauptnamelabels ist array of tlabel

es sotiert sich alles ganz komisch... wo ist mein denkfehler??

Nikolas 25. Feb 2005 18:42

Re: Nach ABC ordnen
 
Formatier deinen Text doch mal etwas besser:
Delphi-Quellcode:
for i:=1 to speicher do for i2:=speicher downto i do
ist recht unleserlich.

Hier
Hat Daniel ein sehr gutes Tutorial zum Sortieren geschrieben, da müsste ein passender Algorhytmus für dich dabei sein. {Bubble o.Ä.)-

ferby 25. Feb 2005 18:52

Re: Nach ABC ordnen
 
Hallo,

ich verwende von seiner Seite den Bubble-Sort Algorithmus.....

ferby 25. Feb 2005 20:19

Re: Nach ABC ordnen
 
hallo,

kann mir jemand vileicht weiterhelfen... ich grübel jetzt schon eine halbe stunde nach.... und kapier nicht warum das nicht hinhaut....

Khabarakh 25. Feb 2005 21:02

Re: Nach ABC ordnen
 
Delphi-Quellcode:
if 'a'>'B' then
  ShowMessage('Stringvergleiche sind nicht ohne!');
Benutze Lowercase(string1)>Lowercase(string2).

ferby 25. Feb 2005 21:13

Re: Nach ABC ordnen
 
hallo,

hab ich auch schon ausprobiert, es geht nicht....

Nikolas 26. Feb 2005 20:33

Re: Nach ABC ordnen
 
Mach doch wirklich was in diese Richtung:
Delphi-Quellcode:
var
sortiert, nichtsortiert: TSTringlist;
i,cnt: integer;
str: string;
begin

sortiert:= TSTringlist.Create;
nichtsortiert:= TSTringlist.Create;

sortiert.sorted:=true;

for i:=1 to AnzahlDerLabel do
begin
sortiert.add(      Tlabel(FindComponent('Label' + IntToStr(i))).Caption);
Nichtsortiert.add( TLabel(findcomponent('Label'+inttostr(i))).caption );
end;

for i:=0 to AnzahlDerLabel-1 {!} do
begin
str := sortiert[i]; // in str steht jetzt die Caption, die alphabetisch geordnet an iter Stelle steht
cnt := nichtsortiert.Indexof(str); // Oben gefundene Caption steht auf dem cnt-ten Label.
// Das passende Label wird an die richtige Stelle gesetzt
Tlabel(FindComponent('Label' + IntToStr(cnt+1))).top :=30+ i*40;
end;
Da musst du dir auch keine Sorgen über die Sortierung machen.

Edit: Tags vergessen.

ferby 27. Feb 2005 12:31

Re: Nach ABC ordnen
 
hallo,

danke.

GJungbluth 6. Feb 2006 12:27

Re: Nach ABC ordnen
 
moin,
man kann auch dbtext benutzen in einem DBCtrlGrid
das ist viel eleganter.

Sidorion 6. Feb 2006 12:53

Re: Nach ABC ordnen
 
Wenn man 2 Strings vergleicht werden diese Zeichenweise verglichen. Damit ist die '12' kleiner, als die '2' und kommt desshalb nach vorne, da '1'<'2'
Grundsätzlich gibt es zei Lösungen für Dein Problem:
1. Du benennnst alle Label um, und zwar indem Du bei den Nummern Nullen einschiebst, sodass die StringLÄNGE aller gleich ist. z.B.: 'Label1' -> 'Label01' (falls max. 2 Stellen 01-99) oder 'Label1'->'Label001' (falls drei Stellen 001-999).
2. Du schreibst Dir eine eigene Compare-Funktion, die den numerischen Teil deiner Strings separat behandelt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz