Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Längster Eintrag einer Listbox ermittel? (https://www.delphipraxis.net/126143-laengster-eintrag-einer-listbox-ermittel.html)

thiagojonas 18. Dez 2008 21:25


Längster Eintrag einer Listbox ermittel?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten abend :-D

Wie kann ich denn den längsten Eintrag einer Listbox anzeigen lassen? Z.B. im TLabel.

Mein Ansatz:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var i:integer;
var target:string;
begin
Label1.Caption := EmptyStr;
for i := 0 to form2.listbox1.Items.Count -1 do
begin
target := Label1.Caption + listbox1.items.Strings[i] + sLineBreak;
Label1.Caption := target;
  end;
end;
Jetzt habe ich alle einezel in ein TLabel untereinander angezeigt bekommen.

Ich möchte nänmlich dem längsten Eintrag folgendes hinzufügen: "____________________________"
Weil die namen unterschiedlich lang sind will ich daduchr versuchen die Unterstriche genau untereinander zu kriegen.
So das es ungefähr so aussieht:



Danke im voraus.

taaktaak 18. Dez 2008 21:35

Re: Längster Eintrag einer Listbox ermittel?
 
Du willst den Eintrag mit der größten Länge suchen? Verwende TextWidth()
- das mit dem Hinzufügen habe ich leider nicht verstanden :roteyes:

thiagojonas 18. Dez 2008 21:40

Re: Längster Eintrag einer Listbox ermittel?
 
Zitat:

Zitat von taaktaak
Du willst den Eintrag mit der größten Länge suchen? Verwende TextWidth()
- das mit dem Hinzufügen habe ich leider nicht verstanden :roteyes:

Danke, habe jetzt ein Schreeshot hochgeladen, damit ihr wisst was ich meine :oops: :-D

lbccaleb 18. Dez 2008 21:41

Re: Längster Eintrag einer Listbox ermittel?
 
Gehe alle Einträge der ListBox mit einer schleife durch, und lese den jeweiligen eintrag aus, dann suchst du mit hilfe von Length() den längsten String raus, und dann hast du Ihn ;-)

blink182 18. Dez 2008 21:42

Re: Längster Eintrag einer Listbox ermittel?
 
Zitat:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var i:integer;
var target:string;
begin
Label1.Caption := EmptyStr;
for i := 0 to form2.listbox1.Items.Count -1 do
begin
target := Label1.Caption + listbox1.items.Strings[i] + sLineBreak;
Label1.Caption := target;
  end;
end;

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var i:integer;
var target:string;
s:string, laenge:integer;
begin
Label1.Caption := EmptyStr;
laenge:=0;
for i := 0 to form2.listbox1.Items.Count -1 do
begin
s:=Form2.Listbox1.items[i];
if length(s)>laenge then
begin
laenge:=length(s)
target:=s;
end;
end;
Label1.caption:=target;
end;
also so würd ich das jetzt machen, denk mal das klappt *ungetestet*

taaktaak 18. Dez 2008 21:55

Re: Längster Eintrag einer Listbox ermittel?
 
Vermutlich wird das in den meisten Fällen so funktionieren, aber die Vorgehensweise die Zahl der Zeichen zu vergleichen ist bei Zeichensätzen mit variabler Buchstabenbreite nicht unbedingt korrekt und zielführend! Deshalb mein Hinweis auf TextWidth() :warn:

thiagojonas 18. Dez 2008 21:59

Re: Längster Eintrag einer Listbox ermittel?
 
Super klappt, Danke!

So wenn ich jetzt den längsten Wert habe, dann füge ich noch den Unterschtrich ein: ":_____________________".

Und wie kann ich bei der anderen Werten das so hinkriegen, dass deren Unterstriche genau unter dem des längsten Wertes ist?

taaktaak 18. Dez 2008 22:06

Re: Längster Eintrag einer Listbox ermittel?
 
Werden Wort und Unterstriche jeweils in einem Label dargestellt?

thiagojonas 18. Dez 2008 22:10

Re: Längster Eintrag einer Listbox ermittel?
 
ja so soll es eigentlich sein. Siehe abbildung oben.
In meinem code werden die werte der listbox untereinader in EINEM Label dargestellt.
Dort füge ich eigentlich auch schon den Unterstrich jeweils ein.
So dass jeer wert im label mit dem unterstrich angezeigt wird.
Das problem ist halt, dass sie unterstricht nicht untereinander sind, weil die einzelnen werte unterschiedlich lang sind.
Ich denke mann müsste die beiden Codes zusammenfügen. Aber was dann?

taaktaak 18. Dez 2008 22:14

Re: Längster Eintrag einer Listbox ermittel?
 
Nun, warum trennst du nicht die Worte und die Unterstriche? Dann kannst du die Label mit den Unterstrichen zur Laufzeit an die richtige Position verschieben! Sonst müsstest du ja den Zwischenraum mit Leerzeichen auffüllen - und das wird bei Zeichensätzen mit variabler Zeichenbreite nicht immer passen.

// edit: Noch besser wäre, für die Anzeige kein Label zu verwenden. Nutze ein Stringgrid. Fixedcols und fixedrows=0, BorderStyle=bsNone, GridlineWidth=0, Color wie gewünscht. In die (unsichtbaren) Zellen schreibst du deine Worte und Unterstriche - fertig!

thiagojonas 18. Dez 2008 22:21

Re: Längster Eintrag einer Listbox ermittel?
 
Ja, weil das komplizierte wäre. Habe nämlich ein etwas größeres Druckprojekt, wo ich mit variablen einfacher und sauberer arbeiten kann.

Aber ich habe eine Idee: :-D

Wenn man den längsten wert(a) nimmt und dann die anzahl der buschstaben mit einem anderen wert(b) der listbox vergleicht, dann erhält man eine Differenz. Und dieser Zahlenwert wäre dann der Wert(c) an Leerzeichen, die man hinzufügen müsste damit dieser Wert(b) genauso lang ist wie der urspünglich längste wert(a).
Geht das?

taaktaak 18. Dez 2008 22:22

Re: Längster Eintrag einer Listbox ermittel?
 
Nur bei einem FixedFont!!!!!!!

thiagojonas 18. Dez 2008 22:27

Re: Längster Eintrag einer Listbox ermittel?
 
Bei what?

taaktaak 18. Dez 2008 22:31

Re: Längster Eintrag einer Listbox ermittel?
 
Nur bei Schriftarten mit einer festen Zeichenbreite, also z.B. Courier. Die meisten Schriftarten, wie z.B. Arial haben unterschidlichen Zeichenbreiten. Ein i ist schmaler als ein w. Aus diesem Grunde ist auch der vorstehend vorgeschlagene Vergleich der Zeichenanzahl nicht korrekt, wenn keine FixedFont verwendet wird.

thiagojonas 18. Dez 2008 22:36

Re: Längster Eintrag einer Listbox ermittel?
 
Oh man...
man hats echt nicht leicht... :wall:

taaktaak 18. Dez 2008 22:38

Re: Längster Eintrag einer Listbox ermittel?
 
Hihihi, das hat auch keiner behauptet!
Kopf hoch! Du wirst schon 'ne Lösung finden :thumb:

Florian H 18. Dez 2008 22:49

Re: Längster Eintrag einer Listbox ermittel?
 
Listboxen unterstützen doch Tabulatoren. Dann machst du einfach einen 200px breiten ersten Tab und deinen String eben zu 'Name: '+#9+': Blubberbla' ...

thiagojonas 18. Dez 2008 22:52

Re: Längster Eintrag einer Listbox ermittel?
 
Ist das eigentlich nicht egal, mit der Schrift? Ich meine es geht doch nur um die Anzahl.

Z.B. Längster Wert = 10 Buchstaben
beliebiger Wert(x) = 7 Buchstaben
10-7 = 3 Leerzeichen, die dem wert(x) zugefügt werden müssen.

thiagojonas 18. Dez 2008 22:54

Re: Längster Eintrag einer Listbox ermittel?
 
:gruebel:

Florian H 18. Dez 2008 23:14

Re: Längster Eintrag einer Listbox ermittel?
 
Zitat:

Zitat von thiagojonas
Ist das eigentlich nicht egal, mit der Schrift? Ich meine es geht doch nur um die Anzahl.

Z.B. Längster Wert = 10 Buchstaben
beliebiger Wert(x) = 7 Buchstaben
10-7 = 3 Leerzeichen, die dem wert(x) zugefügt werden müssen.

Jeweils 10 Zeichen:
iiiiiiiiii
WWWWWWWWWW

Gleichbreit?

thiagojonas 18. Dez 2008 23:22

Re: Längster Eintrag einer Listbox ermittel?
 
gut, da hast du recht, aber gibt es nicht irgend eine funktion, die die anzahl eines strings zählt und nicht die breite der einzelnen Buchstaben der einträge?

thiagojonas 18. Dez 2008 23:50

Re: Längster Eintrag einer Listbox ermittel?
 
So habe was geschrieben, was mir die Differenz zum längsten Wert ausspuckt.

Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
var ausgabe :string;
var ausgabe2 :string;
var i:integer;
var anzahl:integer;
var anzahl2:integer;
var laenge:integer;
var lösung:integer;
var exe:string;
var target:string;
begin
laenge := 0;
for i := 0 to Listbox1.Items.Count - 1 do
  begin
  exe := Listbox1.items[i];
if length(exe)> laenge then
  begin
    laenge:=length(exe);  // Längste Wert wird in der Listbox herausgesucht.
    target:=exe;
end;
 ausgabe := target;   //Ausgabe erhält den längsten Wert der Listbox
 anzahl:= Length(ausgabe); //Anzahl erhält die Anzahl der Zeichen des längsten Wertes in der Listbox

 ausgabe2 := Listbox1.items.Strings[i];
 anzahl2:= Length(ausgabe2);// Anzahl der Zeichen der Werte in der Listbox
 lösung := anzahl - anzahl2; //Subtrahiert Anzahl der Zeichen des längsten Wertes mit der Anzahl der Zeichen der anderen Werte
 showmessage( IntToStr(lösung));// Zeigt das Ergebnis
 end;
end;
Mann müsste dann die Variable "Lösung" nehmen und dann "xLösungen * ' ' (Leerzeichen), damit die alle eine Länge erhalten.
Aber das mache ich morgen, nach der Schule :-D

Kann mir jemand sagen ob der Ansatz so richtig ist?

himitsu 19. Dez 2008 07:03

Re: Längster Eintrag einer Listbox ermittel?
 
[edit]
mist, hatte ausversehn editiser, statt kommentiert :wall:

dieser (der ursprüngliche) Beitrag ist also futsch

taaktaak 19. Dez 2008 07:44

Re: Längster Eintrag einer Listbox ermittel?
 
Moin, Moin.
Wenn auch kürzer gefasst, das wurde schon in #2 vorgeschlagen.
Ob's diesmal hilft?

thiagojonas 21. Dez 2008 22:04

Re: Längster Eintrag einer Listbox ermittel?
 
@himitsu

Danke, aber irgendwie blicke ich da nicht durch.
Könntest du mir das noch ein bisschen näher erläutern?
Danke

himitsu 26. Dez 2008 16:47

Re: Längster Eintrag einer Listbox ermittel?
 
OK, erstmal hab ich 'nen winzigen Fehlerentdeckt ... da oben in den Beispielen hate ich ' ' (Leerzeichen) statt '_' verwendet ... aber wenn man Unterstrichte haben möchte, dann sollte man diese schon verwenden :roll:




Delphi-Quellcode:
MaxTextLen = 0;
For i := ListBox1.Items.Count - 1 downto 0 do
  MaxTextLen := Max(TextLaenge(Label1.Font, ListBox1.Items[i]), MaxTextLen);
das geht alle Items durch, mißt [i]TextLaenge(Label.Font, ListBox1.Items) wie lang jedes Item ist und gibt am Ende die größe Länge in MaxTextLen zurück.



Delphi-Quellcode:
MaxTextLen := 0;
LongestText := -1;
For i := ListBox1.Items.Count - 1 downto 0 do Begin
  i2 := TextLaenge(Label1.Font, ListBox1.Items[i]);
  If i2 >= MaxTextLen Then Begin
    MaxTextLen := i2;
    LongestText := i;
  End;
End;
hier wird das selbe gemacht, nur daß in LongestText zusätzlich noch der Item-Intex des ersten Items ist, wälches der größen Länge entspricht.



Delphi-Quellcode:
TextLaenge(Label1.Font, 'text')
// entsoricht
Label1.Canvas.TextWidth('text')
man kann bei der Litbox auch direkt über das Canvas gehen
For i := ListBox1.Items.Count - 1 downto 0 do
MaxTextLen := Max(Label1.Canvas.TextWidth(ListBox1.Items[i]), MaxTextLen);[/delphi]
Delphi-Quellcode:
MaxTextLen := 0;
LongestText := -1;
For i := ListBox1.Items.Count - 1 downto 0 do Begin
  i2 := Label1.Canvas.TextWidth(ListBox1.Items[i]);
  If i2 >= MaxTextLen Then Begin
    MaxTextLen := i2;
    LongestText := i;
  End;
End;

nja und im Folgendem wird die Breide des Strings S gemessen und von der Soll-Länge X abgezogen - übrig bleibt die Läge, welche noch mit "_" gefüllt werden muß ... also die übrige Läge durch due Breite eines "_" teilen und man hat die Anzahl der noch benötigten "_".
tja und zum Schluß wird ein String erzeigt, welche dieser Anzahl entpricht und an S angehängt und alles in einem Label ausgegeben.
( [oh]function StringOfChar(Ch: Char; Count: Integer): string;[/oh] erzeugt einen String aus einer Vielzahl (Count Zeichen lang) eines bestimmten Zeichens (Ch) )
Delphi-Quellcode:
X := 123; // Label-Text soll 123 Pixel breit sein
S := 'der Text';

i := X - Label1.Canvas.TextWidth(S);     // Länge der "_" in Pixeln
i := i div Label1.Canvas.TextWidth('_'); // Länge der "_" in Zeichen (abgerundet)
Label1.Caption := S + StringOfChar('_', i);

i := (X - Label1.Canvas.TextWidth(S)) div Label1.Canvas.TextWidth('_');
Label1.Caption := S + StringOfChar('_', i);


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

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