Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "Ungültige Zeigeroperation" bei dynamischen Kompos (https://www.delphipraxis.net/30084-ungueltige-zeigeroperation-bei-dynamischen-kompos.html)

Tyler 19. Sep 2004 17:59


"Ungültige Zeigeroperation" bei dynamischen Kompos
 
Hallo,

ich hab hier ein merkwürdiges Problem, was mir arges Kopfzerbrechen bereitet:

In einer Scrollbox werde zur Laufzeit dynamisch Panels erzeugt:
Delphi-Quellcode:
myPanel : Array of TPanel

myPanel[i] := TPanel.Create(Self);

usw.
Auf diesen Panels werden dann im nächsten Schritt dynamisch EditFelder erzeugt:
Delphi-Quellcode:
myEdit : Array of TEdit

myEdit[k] := TEdit.Create(Self);

usw.
k ist an der Stelle 10 * i + 1 um die Editfelder später mit namen anzusprechen.
Ergibt dann z.B.
myEdit[1], myEdit[2], myEdit[3] für die ersten 3 Edits im ersten Panel
myEdit[11], myEdit[12], myEdit[13] für die nächsten 3 Edits im zweiten Panel usw.

Bis hierhin funktioniert auch alles ganz gut.

Nun soll der Inhalt der EditFelder per SQL-Script in eine MySQL-DB geschrieben werden. Um mich erstmal an den Algorithmus ranzutasten, habe ich erstmal nur das 1. EditFeld des 1. Panels angesprochen:
(Ich hatte auch schon n For-To-Schleife gebastelt, um alle Edit-Felder abzuarbeiten. Da ich aber wie gesagt zu diesem Fehler kam, hab ich das Ganze ersteinmal vereinfacht.)
Delphi-Quellcode:
myQuery.SQL.Text := 'INSERT INTO mytable (feld1) VALUES (' +
QuotedStr(myEdit[1].Text + ')';
myQuery.ExecSQL
Wenn ich nun zur Laufzeit ein dynamisches Panel erzeuge, und danach das SQLScript ausführe, werden die Daten korrekt in die Tabelle geschrieben, alles funktioniert.

Wenn ich ein 2. Panel erzeuge, funktionierts auch. Sobald jedoch 3 und mehr Panel im Spiel sind, erhalt ich diese Fehlermeldung:
"EInvalidPointer. Ungültiger Zeigeroperation"
Nach Druck auf "OK" erscheint die Unit "ZSQLStrings" (ich arbeite mit ZEOS) und der obligatorische "Blaue Balken" auf einer gleichnamigen Procedure "SQLStrings" bei "Inherited Changed;".

Hat jemand eine Idee, was da schief läuft, und vor allem, warum das nur bei 3 und mehr dynamischen Panels auftritt? Ich steh hier im Moment irgendwie vor verschlossenen Türen :(

danke im Vorraus!

tyler

Sharky 20. Sep 2004 06:01

Re: "Ungültige Zeigeroperation" bei dynamischen Ko
 
Hai Tyler,

es sieht so aus als wäre etwas falsch beim erstellen deiner Edits?
Ich würde mir mit einem TMemo eine kleine Debugfunktion bauen um mal den Zugriff auf die Edits zu testen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  k : Integer;
  i : Integer;
  wert : Integer;
begin
  Memo1.Clear;
  for k := 0 to 4 do
  begin
    for i := 1 to 3 do
    begin
      wert := (k*10) + i;
      Memo1.Lines.Add(IntToStr (wert) + ': ' + myEdit[wert].Text);
    end;
  end;
end;

Tyler 21. Sep 2004 13:08

Re: "Ungültige Zeigeroperation" bei dynamischen Ko
 
ich glaub den Fehler gefunden zu haben, die FOR-DO-Schleife, welche das SQL-Script füllen sollte lautete ungefähr so:

Delphi-Quellcode:
for k := 1 to Length(myPanel)
also ich hier einmal die Länge fest vorgegeben habe (3) hats funktioniert. Also sorgte Length(myPanel) für den Fehler.

Ausserdem hatte ich wohl einen Denkfehler drin, denn die dynamische EditFeld-Erstellung mit

(i * 10) + 1

sorgt ja dafür, das im Array von myEdit die Adressen folgendermassen vergeben werden:

1,2,3,11,12,13,21,22,23

Ich denke mal bei einem Array ist das nicht unproblematisch, da die Adressierung wohl besser fortlaufend stattfinden sollte:

1,2,3,4,5,6,7,8

Jedenfalls hab ich das auch behoben, und erstmal funktionierts :)

Danke für den Hint Sharky :)

tyler


//EDIT

und ausserdem hab ich geschlafen:

im OnCreate der Form stand:

SetLength(myPanel, 1);
SetLength(myEdit, 1);

Das musste ich natürlich entfernen, und in der Procedure, in der die Komponenten dynamisch erzeugt werden folgendes ergänzen:

SetLength(myPanel, i + 1); // Anfangswert von i ist 0, wird je Panel mit 1 inkludiert
SetLength(myEdit, (i + 1) * 51); // pro Panel gibt es 5 Editfelder

Nur noch eine Frage... ich hab im Forum gelesen, das man SetLength so selten wie möglich nutzen soll, da die Funktion sehr speicherintensiv ist? Was ist an der Aussage dran?

Sharky 21. Sep 2004 16:37

Re: "Ungültige Zeigeroperation" bei dynamischen Ko
 
Zitat:

Zitat von Tyler
...Nur noch eine Frage... ich hab im Forum gelesen, das man SetLength so selten wie möglich nutzen soll, da die Funktion sehr speicherintensiv ist? Was ist an der Aussage dran?

Wenn SetLength aufgerufen wird muss jedesmal der notwendige neue Speicher belegt werden, dann werden die Daten vom "alten Speicher" nach dort kopiert und abschließend wird der alte Speicher freigegeben.
Das benötigt natürlich jedesmal Zeit.

Je nach Anwendungsfall ist es schneller das Dyn-Array z.B. immer in 10er Schritten zu erhöhen. Dadurch reduzieren sich die ständigen Kopierfunktionen.

Tyler 21. Sep 2004 17:38

Re: "Ungültige Zeigeroperation" bei dynamischen Ko
 
hm... okay, ist soweit einleuchtend, aber leider kann ich das nicht umgehen..

Danke für deine Hilfe so long :)

Tyler


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