Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wertezuweisung an Arrays (https://www.delphipraxis.net/4322-wertezuweisung-arrays.html)

Hellcat 24. Apr 2003 12:09


Wertezuweisung an Arrays
 
Hi Leute!

Folgendes Problem: bei dem Code
Delphi-Quellcode:
  for i := 1 to 35 do {Durchlauf für alle Panels}
...
repeat                              {HL}
        Hhl := Hhl + Zeile[Zaehler];
        inc (Zaehler);
      until Zeile[Zaehler] = ';';
...
if Hhl <> '-1' then BildHL[i] := true;
sollte doch für den Array von BildHL jeweils der entsprechende Wert zugewiesen werden. Bei mir bleiben aber alle auf dem Default-Wert (in diesem Fall false)...woran kann das liegen?

nailor 24. Apr 2003 13:05

Also der Codeschnipsel ist sehr kurz, aber ich vermute, dass einfach HHL immer '-1' ist?!?!

Oder hast du ein begin/end vergessen?

Hellcat 24. Apr 2003 14:13

Nein, das hab gleich als erstes überprüft...

ich stell hier noch mal die gesamte Funktion rein, aber da ist viel mit dabei was mit hhl nicht viel zu tun hat
Delphi-Quellcode:
begin
  zaehler := 21;
  for i := 1 to 35 do {Durchlauf für alle Panels}
    begin               {Initialisierung der einzelnen Variablen}
      HName := '';
      HFarbe := '';
      HZeit := '';
      HSchl := '';
      HHl := '';
      HSnd := '';
      repeat                             {Name}
        HName := HName + Zeile[Zaehler];
        inc (Zaehler);
      until Zeile[Zaehler] = ';';
      inc (Zaehler);
      repeat                            {Zeit}
        HZeit := HZeit + Zeile[Zaehler];
        inc (Zaehler);
      until Zeile[Zaehler] = ';';
      if HZeit = '0' then Hzeit := '';
      inc (Zaehler);
      repeat                              {Farbe}
        HFarbe := HFarbe + Zeile[Zaehler];
        inc (Zaehler);
      until Zeile[Zaehler] = ';';
      HFarbe := IntToHex((StrToInt('$' + HFarbe)),6);
      inc (Zaehler);
      repeat                              {THL}
        Hhl := Hhl + Zeile[Zaehler];
        inc (Zaehler);
      until Zeile[Zaehler] = ';';
      inc (Zaehler);
      repeat                              {Halle offen/zu}
        HSchl := HSchl + Zeile[Zaehler];
        inc (Zaehler);
      until Zeile[Zaehler] = ';';
      inc (Zaehler);
      repeat                              {Beschallung}
        HSnd := HSnd + Zeile[Zaehler];
        inc (Zaehler);
      until Zeile[Zaehler] = '#';
      Zaehler := Zaehler + 2;
        with Application.MainForm.FindComponent('PanLab' + IntToStr(i)) as TLabel do  {Zuweisung Hallenname}
          begin
            caption := HName;
          end;
        with Application.MainForm.FindComponent('PanLabT' + IntToStr(i)) as TLabel do  {Zuweisung Hallenzeit}
          begin
            caption := HZeit;
          end;
        with Application.MainForm.FindComponent ('PanHalle' + InttoStr(i))as TPanel do  {Zuweisung Panelfarbe}
          begin
            Color := StrToInt('$' + HFarbe);
          end;
        if Hhl <> '-1' then BildHL[i] := true;                                  {Zuweisung HL-Bild}
          BildHL[i] := HL (Application.MainForm.FindComponent('HLPan1'+IntToStr(i))as TImage,Mbleft,BildHL[i]);
        if HSchl <> '-1' then BildSchl[i] := true;                              {Zuweisung Schloss-Bild}
          BildSchl[i] := Schloss (Application.Mainform.Findcomponent('SchlPan'+IntToStr(i))as TImage,Mbleft, BildSchl[i]);
        if HSnd <> '-1' then BildSound[i] := true;                               {Zuweisung Beschallung-Bild}
          BildSound[i] := Sound (Application.MainForm.Findcomponent('SndPan'+IntToStr(i))as TImage, Mbleft, BildSound[i]);
    end;
end;

Touchdown 24. Apr 2003 15:17

Mach das Ganze doch einfach mal nur mit dem ersten Wert und beachte die anderen nicht, wenn dann da was schief gehen sollte kannste es durch Debuggen sehr schnell rausfinden.

Etwas überladen die Methode, vielleicht hilft dir auch ein Auslagern in eine 2. bzw 3. Methode. Macht es einfach übersichtlicher.

Hellcat 24. Apr 2003 16:20

Der Absturz tritt schon beim ersten Durchlauf auf...allerdings (bei der gleichen Zeile die geladen wird) mal bei Hhl, mal bei HSchl und mal bei HSnd auf - spätestens aber dort. Und eine Zuweisung erfolgte bei keinem der zahlreichen Versuche...

Daniel B 24. Apr 2003 16:23

Hallo,

Du solltest Deine Schleife bei 0 anfangen lassen, ist so üblich bei Arrays. ;)
Solange noch kein Eintrag drin ist und Du den Array nicht per Hand erhöht hast, kannst Du an Stelle[1] nichts schrieben, weil der Platz sozusagen noch gar nicht existiert.

Grüsse, Daniel :hi:

Hellcat 24. Apr 2003 18:12

Hmm, ich hab ihn aber eigentlich entsprechend definiert...oder liegt der Fehler in der Deklaration?

Delphi-Quellcode:
var

{Globale Variablen/Arrays}
    BildHL : array[1..35] of boolean;
    BildSchl : array[1..35] of boolean;
    BildSound : array[1..35] of boolean;
    z: integer;

implementation

 begin
  for z:=1 to 35 do
  begin
    BildHL[z] := false;
    BildSchl[z] := false;
    BildSound[z] := false;
  end;

Touchdown 25. Apr 2003 10:05

Ein Fehler in der Deklaration liegt nicht vor, aber gewöhn dir an in solchen Fällen mit 0 anzufangen.

So hab ich keinen Fehler gefunden, durch Debuggen sollte es recht einfach sein dahinter zu kommen.

PS: i := i + 1 ist 10% schneller als inc(i). Hab mir mal ein kleines Testprogramm dafür geschrieben um es zu testen :mrgreen:

Daniel B 25. Apr 2003 12:50

Hallo,
Zitat:

Zitat von Touchdown
PS: i := i + 1 ist 10% schneller als inc(i). Hab mir mal ein kleines Testprogramm dafür geschrieben um es zu testen :mrgreen:

Das will ich sehen!

Grüsse, Daniel :hi:


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