Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Werteübergabe (https://www.delphipraxis.net/3663-werteuebergabe.html)

Hellcat 24. Mär 2003 15:51


Werteübergabe
 
Hi Leute!
Folgendes Problem: Ich hab 35 Panels, von denen bestimmte Eigenschaften an eine Funktion übergeben werden sollen. Mein Problem ist nur, daß ich keinen blassen Schimmer habe wie ich es hinkriege daß für die Panels 1 bis 35 jedes Mal die entsprechende Eigenschaft rausgreift.
Delphi-Quellcode:
procedure TForm1.Speichern1Click(Sender: TObject);//Menüpunkt "Speichern"
var i: integer;
begin
  for i := 1 to 35 do
    begin
      speichern('PanHalle'+IntToStr(i)+'.caption','PanHalle'+IntToStr(i)+
        'T'+'.caption', IntToHex(Strtoint('PanHalle'+IntToStr(i)+'.Color'),6),
        StrToBool('bildTHL'+IntToStr(i)),StrToBool('bildSchl'+IntToStr(i)),
        StrToBool('bildSound'+IntToStr(i)));
    end;
end;
Was ich da gecoded habe ist der größte Schwachsinn, denn in dem Fall würde beispielsweise nicht die entsprechende Caption des Panels 1 speichern sondern immer nur 'PanHalle1.caption'...und das ist nun wirklich nicht im Sinne des Erfinders

Hier noch mal der Code für die aufgerufene Prozedur:
Delphi-Quellcode:
procedure speichern (Hname, Zeit, HFarbe: string; Schl, THL, Sound:boolean);

mirage228 24. Mär 2003 16:14

das geht mit findcomponent!
so kannst auf die compos zugreifen

Beispiel:
Delphi-Quellcode:
FindComponent(('Panel' + Inttostr(i)) as TPanel).Caption { oder Color oder irgendne Eigenschaft}

Hellcat 25. Mär 2003 08:18

Danke!

@moderatoren: Der Thread ist versehentlich im falschen Forum gelandet...wäre nett wenn ihr den verschieben könntet, damit ihn andere später leichter finden (denke mal daß ich nicht der einzige bin der irgendwann mal über dieses Anfänger-Problem stolpert..)

Hellcat 25. Mär 2003 11:21

Hmm, das klappt leider nicht so ganz
Delphi-Quellcode:
speichern(FindComponent(('PanHalle' + Inttostr(i)) as TPanel).caption)
ich erhalte immer die Meldung "[Error] UnitHaupt.pas(314): Operator not applicable to this operand type", selbst wenn ich mich an die Vorgabe aus der OH halte... woran kann das liegen?

Daniel B 25. Mär 2003 11:41

Hallo,

ich habe es mal nach Delphi Language verschoben, in Klatsch und Trasch hatte es wirklich nichts verloren. ;)

Grüsse, Daniel :hi:

mirage228 25. Mär 2003 12:20

sorry hab mich vertippt! es muss heissen:

Delphi-Quellcode:
(FindComponent('PanHalle' + IntToStr(i)) as TPanel).Caption

Hellcat 25. Mär 2003 14:17

Und wie mache ich das dann wenn ich eine vorher definierte Variable vom Typ Boolean habe(THL, THL2,..., THL35)? Die kann ich ja nicht mit FindComponent aufrufen...

X-Dragon 25. Mär 2003 15:19

Zitat:

Zitat von Hellcat
Und wie mache ich das dann wenn ich eine vorher definierte Variable vom Typ Boolean habe(THL, THL2,..., THL35)? Die kann ich ja nicht mit FindComponent aufrufen...

Wenn die Variablen schon Werte zugewiesen bekommen haben, kann man sie z.B. so kontrollieren:

Delphi-Quellcode:
  for i := 1 to 35 do
    if StrToBool('THL'+IntToStr(i)) then
      ShowMessage ('Diese Variable hat den Wert True :)');

Hellcat 25. Mär 2003 15:40

Ich will sie ja aber nicht kontrollieren sondern in eine Textdatei speichern. Und dafür muß ich an die Funktion zum schreiben einen boolschen Wert übergeben. Dein Tipp hilft mir da also nicht so wirklich weiter...

X-Dragon 25. Mär 2003 18:33

Zitat:

Zitat von Hellcat
Ich will sie ja aber nicht kontrollieren sondern in eine Textdatei speichern. Und dafür muß ich an die Funktion zum schreiben einen boolschen Wert übergeben. Dein Tipp hilft mir da also nicht so wirklich weiter...

Dann wäre es aber noch ganz interessant zu wissen wie deine Speichern-Prozedur überhaupt arbeitet, denn bis vorhin war es noch eine Prozedur :roll:.

Also soll deine Speicher-Funktion die du hast, 35mal aufgerufen werden und jeweils die kompletten Infos gespeichert werden?

Hellcat 26. Mär 2003 08:42

Sorry, da hatte sich ein Schreibfehler eingeschlichen...selbstverständlich ist es nach wie vor noch eine Prozedur

Delphi-Quellcode:
procedure speichern (Hname, Zeit, HFarbe: string; Schl, THL, Sound:boolean);
var save: Textfile;
begin
  AssignFile (save, 'zustand.hbl');
  {$i-} Append (save){$i+};
  if IOResult <> 0 then
    begin
      showmessage ('Die Datei "Zustand.hbl" wurde nicht gefunden!');
      exit;
    end;
  writeln (Save, TimeToStr(now) +';'+ HName +';'+ Zeit +';'+ HFarbe +';'+
            BoolToStr(Schl) +';'+ BoolToStr (THL) +';'+ BoolToStr (Sound));
  closeFile(Save);
end;
Und der Aufruf sieht derzeit aus wie folgt:
Delphi-Quellcode:
procedure TForm1.Speichern1Click(Sender: TObject);//Menüpunkt "Speichern"
var i: integer;
begin
  for i := 1 to 35 do
    begin
      speichern((FindComponent('PanLab' + IntToStr(i)) as TLabel) .Caption,
                (FindComponent('PanLabT' + Inttostr(i)) as TLabel).caption,
                IntToHex(((FindComponent('PanHalle' + InttoStr(i))as TPanel).Color),6),
                StrToBool('bildTHL'+IntToStr(i)),
                StrToBool('bildSchl'+IntToStr(i)),
                StrToBool('bildSound'+IntToStr(i)) );
    end;
end;

X-Dragon 26. Mär 2003 10:40

Gibts eine Fehlermeldung(wenn wo?) oder werden die Daten falsch gespeichert, oder läuft es jetzt inzwischen?

Hellcat 26. Mär 2003 11:02

Wenn ich bei meinem Programm auf "Speichern" klicke erhalte ich die Meldung:
"Project Halbel.exe raised exception class EConvertError with message ''BildTHL1' is not a vaild boolean value'. Process stopped.[...]"

Ist ja auch logisch, da er laut meinen anweisungen 'BildTHL1' in einen boolschen Wert umrechnet - und kann ja nicht klappen. Die Frage ist aber wie geht das die Variblen zuzuweisen mittels der For-Schleife...

X-Dragon 26. Mär 2003 11:20

Kannst du noch die Deklaration deiner Variablen posten? Denn ohne genaue Bezeichnungen und den jeweiligen Datentypen, ist die Fehlersuche etwas schwierig :).

Um einen Fehler grundsätzlich genauer zu lokalisieren kannst du am besten einen Breakpoint z.B. am Anfang deiner Speichern.Click-Prozedur setzen und dann mit F7 Zeile für Zeile dein Programm testen.

Hellcat 26. Mär 2003 11:32

Stimmt, macht Sinn :roll:
Delphi-Quellcode:
   {Halle 1}
    bildTHL1: boolean = false;     // Variable für Bild "Hallenleiter", Halle 1
    BildSchl1: boolean = false;    // Variable für Bild "Schloß", Halle 1
    bildSound1: boolean = false;   // Variable für Bild "Sound", Halle 1
Um den Fehler mal zu päzesieren:
Ich will folgendes übergeben:

BildTHL1

und übergebe aber:

'BildTHL1'

Wenn ich nur diese eine Variable übergeben müsste könnte ich sie ja einfach hinschreiben, ich muss aber leider die Variable mit den Zahlen 1-35 am Ende übergeben...

X-Dragon 26. Mär 2003 12:13

Bei solchen Variablen würde ich eher empfehlen, sie in so einem Format zu definieren:

Delphi-Quellcode:
var
  bildTHL : array[1..35] of Boolean;

begin
  for i := 1 to 35 do
    bildTHL[i] := False;
Sollte die Handhabung etwas vereinfachen. Denn dann brauchst du deine Boolschen-Variablen auch nicht erst zu einem String zusammensetzen, sonder kannst sie direkt [i]BoolToStr(bildTHL) nutzen.

Hellcat 26. Mär 2003 14:01

Ok, jetzt geht's. Vielen Dank!


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