Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi variable felder, string aufspalten,.... (https://www.delphipraxis.net/87477-variable-felder-string-aufspalten.html)

webtiger 1. Mär 2007 07:57


variable felder, string aufspalten,....
 
hi
ich arbeite zur zeit an einem infoprojekt und könnte etwas hilfe gebrauchen^^
also....ich hab eine globale variable z vom typ integer. die wird auf formular 1 eingegeben. z muss zwischen 10 und 100 liegen und ungerade sein. soweit funktioniert alles wunderbar.
jetzt möchte ich das jede zahl von 1 bis z in einem extra feld ausgegeben wird (bin mir noch nicht ganz sicher ob ich besser ein label oder statictext nehmen sollte?). mein problem ist ich weiß nicht wie ich das am besten mache. die zahlen sollten dabei in ziffern aufgespalten werden. also das z.b. bei 13 nicht ein feld mit 13 drin dasteht sondern ein feld mit 1 und ein feld mit 3.

wär total nett wenn ihr mir sagen könntet wie ich das am besten auf die reihe kriege. ich hab delphi 7 falls das wichtig sein sollte.

danke im voraus


-web

guidobrose 1. Mär 2007 08:03

Re: variable felder, string aufspalten,....
 
Du könntest die Zahl in einen String umwandeln (brauchts du wahrscheinlich sowieso, um sie als Text ausgeben zu können) und den String dann mittels der Funktion "copy" in seine Teile zerlegen. Geht vielleicht auch einfacher, aber nur mal als Vorschlag.

Edit:

Du kannst auch direkt auf ein Zeichen eines Strings zugreifen, in der Art:
Delphi-Quellcode:
MeinStringMitDerZahlDrin:=IntToStr(MeineZahl);
Label1.Caption:=MeinStringMitDerZahlDrin[1];
Das entspräche dann dem ersten Zeichen in dem String.


Guido

Tormentor32 1. Mär 2007 08:09

Re: variable felder, string aufspalten,....
 
kleines Schnippsel, was du dir dann zurechtbiegen könntest

Delphi-Quellcode:
  s := inttostr(zahl); // s ist eine Stringvariable
  for i := 1 to length(s) do
    label1.caption := label1.caption + s[i]+' ';
Macht nichts anderes, als die einzelnen Ziffern einer Zahl in ein Label zu schreiben...

Edit: komische Formatierung...

webtiger 1. Mär 2007 08:19

Re: variable felder, string aufspalten,....
 
also....das hab ich grad ausprobiert...danke für den hinweis :)
aber mein prob ist noch....wie krieg ich das prog dazu mir alle zahlen von 1 bis z auszugeben? bis jetzt krieg ich immer nur z raus....bin noch immer für jede hilfe dankbar^^ (sry, blutiger anfänger.....)


[edit] btw....aber eigentlich ist mein problem nicht die zahlen in ein label zu kriegen sondern in einzelne. ich glaub in einem label kann ich die danach nicht gut weiterverwenden. ich habe auch überlegt ein array zu erstellen. geht das überhaupt mit einer variable? [/edit]
-web

mkinzler 1. Mär 2007 08:24

Re: variable felder, string aufspalten,....
 
Delphi-Quellcode:
if TryStrToInt( s, z) then
    for i := 1 to z do
       s2 := s2 + IntToStr(i) + ' ';
[Edit: in einzelnen Labels:]
Delphi-Quellcode:
   with TLabel.Create( Form) do
   begin
       Parent = Form;
       left := i*20;
       Top := 100;
       Name := 'Label'+IntToStr(i);
       Caption := IntToStr(i);
   end;
[/Edit]

marabu 1. Mär 2007 08:35

Re: variable felder, string aufspalten,....
 
Hallo,

da bei z = 99 nicht gut alle Zahlen in einer Zeile angezeigt werden können, zielt alles auf eine zweidimensionale Darstellung hin. Dabei könnte die Komponente TStringGrid (Palettenseite "Zusätzlich") ganz hilfreich sein.

Grüße vom marabu

mkinzler 1. Mär 2007 08:41

Re: variable felder, string aufspalten,....
 
Hallo Achim,
du hast natürlich recht, wir das das auch bewußt, der Code sollte ihm aber zum Verständnis reichen.

xZise 1. Mär 2007 11:03

Re: variable felder, string aufspalten,....
 
Also möchtest du jede Zahl in ein Label schreiben (von 1 bis z) oder nur in ein Label (1, 2, 3 ... z)?
Für das 1.:
Zuerst brauchst du die Labels... Am besten in ein Array, dann sind die einfacher zu erreichen:
Delphi-Quellcode:
var
  lbls : array [0..99] of TLabel;
Nun musst du sie beim Anzeigen der Form erstellen:
Delphi-Quellcode:
for i := 0 to 99 do
begin
  lbls[i] := TLabel.Create(<Besitzter>); // Das einzelne Label erstellen (Der Besitzter des Labels, ist normalerweise das Formular, und steht in der Varible "self")
  with lbls[i] do begin
    Parent := self;
    Top := <Y>; //Z.B.: i * 10 + 8; Der Y-Abstand => Dynamisch!
    Left := <X>; //Z.B.: 8; Der X-Abstand => Statisch!
    Visble := false;
    Caption := IntToStr(i + 1);
  end;
end;
Diese musst du nun passend Anzeigen:
Delphi-Quellcode:
for i := 0 to z do // Alle Labels anzeigen, bis "z"
begin
  lbls[i].Visible := true;
end;
for i := z + 1 to 99 do // Den Rest ausblenden
begin
  lbls[i].Visible := false;
end;

webtiger 4. Mär 2007 16:07

Re: variable felder, string aufspalten,....
 
danke für eure hilfe. leider kann ich die guten tipps erst am di in der schule testen wenn ich info hab. aber werdet sicher noch ne menge delphi-verzweiflung von mir zu hören kriegen^^

@xZise: ich möchte jede zahl in ein Label schreiben. und eigentlich sollten zweistellige zahlen noch aufgeteilt werden so das am ende in jedem label wirklich nur eine ziffer steht.


-web

xZise 4. Mär 2007 16:19

Re: variable felder, string aufspalten,....
 
Zitat:

Zitat von webtiger
@xZise: ich möchte jede zahl in ein Label schreiben. und eigentlich sollten zweistellige zahlen noch aufgeteilt werden so das am ende in jedem label wirklich nur eine ziffer steht.

Du weist schon wie viel arbeit das sein wird? ~170 Labels ;)

webtiger 6. Mär 2007 10:44

Re: variable felder, string aufspalten,....
 
ja. das ist mir so langsam auch klar geworden^^ aber jetzt hab ich das prog angefangen, jetzt will ich es auch fertig kriegen *g* naja, und ich hab noch max. 3 infostunden. aber wird schon....


-web

webtiger 6. Mär 2007 11:26

Re: variable felder, string aufspalten,....
 
mal noch ne kleine frage hierzu:

Delphi-Quellcode:
   with lbls[i] do begin
    Parent := self;
    Top := <Y>; //Z.B.: i * 10 + 8; Der Y-Abstand => Dynamisch! 
    Left := <X>; //Z.B.: 8; Der X-Abstand => Statisch! 
    Visble := false;
    Caption := IntToStr(i + 1);
ich krieg es nur hin das die zahlen untereinander stehen. wie kann ich programmieren, dass 9 labels in einer reihe stehen?


-web

marabu 6. Mär 2007 12:10

Re: variable felder, string aufspalten,....
 
Hallo,

das Prinzip ist einfach:

Delphi-Quellcode:
function LabelToPoint(lbl: TLabel; index: Integer): TPoint;
const
  MarginLeft = 20;
  MarginTop = 30;
  LabelCols = 9;
  VertGap = 8;
  HorzGap = 8;
begin
  Result := Point(
              MarginLeft - HorzGap + (index mod LabelCols) * (lbl.Width + HorzGap),
              MarginTop - VertGap + (index div LabelCols) * (lbl.Height + VertGap)
            );
end;
Die Konstanten kannst du an deine Bedürfnisse anpassen. Das Ergebnis liefert die Top und Left für Label[i] in Y und X - wenn ich keinen Fehler eingebaut habe.

Grüße vom marabu

webtiger 7. Mär 2007 11:22

Re: variable felder, string aufspalten,....
 
danke für die hilfe. leider geht mein pc in info nicht richtig, also kann ich es erst morgen testen und euch dann weiter mit meiner unwissenheit nerven^^ danke für den tipp, werd's versuchen.
was mir grad noch einfällt: wenn in einem label z.b. 11 stehen hätte.....wie krieg ich es hin dass das in 2 label aufgespalten wird? ich würd das gerne selbst probieren aber ich hab inzwischen wegen den pc-probs richtigen zeitmangel mit meinem projekt.

wenn ich alle labels mit einer bestimmten hintergrundfarbe kopieren und neu einfügen möchte mach ich das über copy, oder?

danke für eure hilfe.


-web

TonyR 7. Mär 2007 13:10

Re: variable felder, string aufspalten,....
 
Zitat:

Zitat von webtiger
....wie krieg ich es hin dass das in 2 label aufgespalten wird? ...

im Prinzip musst du jetzt nur das anwenden, was z.B. in Beitrag #3 oder #5 geschrieben wurde!
Dafür könntest prüfen, ob der in einen String umgewandelte Wert mehr als eine Stelle hat oder ob der vorherige Integer größer als 9 ist.

Zitat:

Zitat von webtiger
...ich würd das gerne selbst probieren aber ich hab inzwischen wegen den pc-probs richtigen zeitmangel mit meinem projekt....

Warum arbeitest du nicht ein bisschen zu Hause daran??? Lade dir TurboDelphi, D7 PE, D6 PE oder D2005 PE herunter und probier ein bisschen rum!

Zitat:

Zitat von webtiger
...wenn ich alle labels mit einer bestimmten hintergrundfarbe kopieren und neu einfügen möchte mach ich das über copy, oder?...

:?: Willst du jetzt doch labels schon im Designer erschaffen? Vorher war doch noch die Rede von einer Erstellung zur Laufzeit!?
Um die Frage zu beantworten, im Prinzip JA, denke ich (wenn ichs richtig verstanden habe, was du vorhast).

webtiger 13. Mär 2007 10:50

Re: variable felder, string aufspalten,....
 
Zitat:

Zitat von TonyR
Warum arbeitest du nicht ein bisschen zu Hause daran??? Lade dir TurboDelphi, D7 PE, D6 PE oder D2005 PE herunter und probier ein bisschen rum!

danke für den tipp. wusste garnicht das es delphi zum runterladen gibt. danke, werd mir das programm gleich mal als mail schicken und dannzu hause dran arbeiten. danke :)

Zitat:

Zitat von TonyR
:?: Willst du jetzt doch labels schon im Designer erschaffen? Vorher war doch noch die Rede von einer Erstellung zur Laufzeit!?
Um die Frage zu beantworten, im Prinzip JA, denke ich (wenn ichs richtig verstanden habe, was du vorhast).

ja, ich will die labels zur laufzeit erstellen und dann sollen sich durch anklicken von 2 bestimmten labels die labels schwarz färben. ich hab da vllt. noch etwas hohe ansprüche dran^^ aber wird schon funzen am ende....


-web

webtiger 15. Mär 2007 10:13

Re: variable felder, string aufspalten,....
 
sry, ich glaub ich bin inzwischen die blödheit in person....
ich krieg das string teilen und in 2 labels ausgeben einfach nicht auf die reihe. ich hab jetzt insgesamt in der prozedur stehen:

Delphi-Quellcode:
procedure tform1.geben;
var
    i : integer;
    s : string;
lbls : array [0..99] of TLabel;
begin
               
with unit2.form2 do begin

for i := 0 to 99 do
begin
  lbls[i] := TLabel.Create (form2); // Das einzelne Label erstellen (Der Besitzter des Labels, ist normalerweise das Formular, und steht in der Varible "self")
  with lbls[i] do begin
    Parent := form2;
    Top := i*19 ; //dynamischer y-abstand
    Left := 19; //statischer x-abstand
    Visible := false;
    Caption := IntToStr(i + 1);
  end;
end;

for i := 0 to z do // labels bis z anzeigen
begin
  lbls[i].Visible := true;
end;
for i := z to 99 do // anderen labels nicht anzeigen
begin
  lbls[i].Visible := false;
end;

if i>9 then begin
   s := inttostr(i);


end;

spielen;

end;
end;
ich kriegs einfach nicht auf die reihe so weiter zu machen das ich die zahlen die größer als 9 sind in 2 benachbarten labels auszugeben. wie mach ich das jetzt am besten?

thx für die ganzen hilfen aber ich kriegs absolut nicht auf die reihe....


-web

marabu 15. Mär 2007 10:44

Re: variable felder, string aufspalten,....
 
Hallo,

angenommen du hast deine Labels bereits alle erzeugt und sie stehen in einer TComponentList bereit:

Delphi-Quellcode:
procedure ShowDigits(
  cl: TComponentList;     // Liste mit den Labels
  const number: Cardinal; // darzustellende Zahl
  var index: Integer      // erster zu verwendender Label
);
var
  s: string;
  i: Integer;
begin
  s := IntToStr(number);
  for i := 1 to Length(s) do
  begin
    TLabel(cl[index]).Caption := s[i];
    Inc(index);
  end;
end;
Getippt und nicht getestet.

Das sind so wenige Zeilen - da solltest du dir einen Zugang erarbeiten können.

Aufmunternde Grüße

webtiger 20. Mär 2007 20:20

Re: variable felder, string aufspalten,....
 
danke :)
ich hab mein projekt jetzt fertig, muss es morgen vorstellen und abgeben. danke für die ganzen hilfen :) ich schreib euch dann was bei rausgekommen ist.


-web

webtiger 29. Mär 2007 18:28

Re: variable felder, string aufspalten,....
 
nochmal ein dickes thx!
hab auf mein programm 14 punkte, also ne 1 bekommen. :)
thx an alle!!


-web


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 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