![]() |
Problem mit einem Zeiger...
Ich bin neu in die Zeiger eingestiegen und habe folgendes Konstrukt:
Das Formular:
Delphi-Quellcode:
Jetzt tritt in cbListChange (Z. 17) der Fehler auf:
type
TfrmVariables = class(TForm) cbList: TComboBox; eName: TEdit; eValue: TEdit; {...} procedure cbListChange(Sender: TObject); private parser : ^TExCQParser; public {...} procedure setVariables(Data : TExCQParser); end; procedure TfrmVariables.cbListChange(Sender: TObject); begin eName.Text := parser^.Variables.Items[cbList.ItemIndex].Name; // <<< eValue.Text := FloatToStr(parser^.Variables.Items[cbList.ItemIndex].Variable.Values[0]); end; procedure TfrmVariables.setVariables(Data: TExCQParser); var i : Integer; begin parser := @Data; cbList.Clear; for i := 0 to parser^.Variables.Length - 1 do begin cbList.Items.Add(parser^.Variables.Items[i].Name); end; end; Zitat:
Delphi-Quellcode:
Davor ist die Form nicht sichtbar, und die Funktion "setVariables" führt er ordnungsgemäß aus.
procedure TForm1.Button21Click(Sender: TObject);
begin frmVariables.Show; frmVariables.setVariables(Parser); end; Wenn es nicht am Code liegt, werde ich mich wohl an den Programmierer des Parsers wenden müssen ;) |
Re: Problem mit einem Zeiger...
Zitat:
von welchem Typ ist denn dieser Parser. Schon klar, dass es sich um TExCqParser handelt, aber ist das eine Klasse oder ein Record? (gehe mal stark von ersterem aus). Wenn es eine Klasse ist, so wirst Du schon mal keinen Zeiger brauchen, da in der Variable Parser eh nur eine Referenz (ein impliziter Zeiger) übergeben wird. Dein Fehler kann gleich durch verschiedene Dinge entstehen, aber am wahrscheinlichsten liegt es am falschen Index. Du greifst auf die Eigenschaft parser.Variables.Items zu, die dürften sich zwischen 0 und parser.Variables.Length - 1 liegen. Das prüfst Du aber nie. Für den Fall, dass noch kein Eintrag ausgewählt ist, dürfte der Index hier -1 sein und es könnte zu dem Fehler kommen. Dann prüfst Du auch nicht, ob ein Parser zugewiesen wurde (assigned(parser^)). Ich gehe einfach mal davon aus, dass es sich bei dieser Prozedur um die Ereignisbehandlung eine Komponente handelt? Und genau hier dürfte eben dieses Ereignis schon beim Anzeigen aufgerufen werden (und der ItemIndex muss zu dem Zeitpunkt nicht gültig, der Parser nicht gesetzt sein). Also einfach vorher prüfen und nur wenn Du hier die Korrektheit sicherstellst den Inhalt ausführen. Gruß Der Unwissende |
Re: Problem mit einem Zeiger...
Hallo Fabian,
der Fehler scheint ja heute sehr beliebt zu sein: ![]() Bei dir steckt er in der Methode setVariables. Gruß Hawkeye |
Re: Problem mit einem Zeiger...
Guten Morgen,
es könnte auch so sein: Das OnChange() der ComboBox wird beim Programmstart automatisch aufgerufen. Darin wird auf die Zeigervariable parser zugegriffen, bevor diese durch den Benutzer (Button21) initialisiert wird.
Delphi-Quellcode:
Freundliche Grüße
procedure TfrmVariables.cbListChange(Sender: TObject);
begin if Assigned(Parser) then begin eName.Text := Parser.Variables.Items[cbList.ItemIndex].Name; eValue.Text := FloatToStr(Parser.Variables.Items[cbList.ItemIndex].Variable.Values[0]); end else {...}; end; |
Re: Problem mit einem Zeiger...
Ich glaube dein Problem kommt eher daher, das
du zu deiner Combo keinen Wert ausgewählt hast -> cbList.ItemIndex=-1 und du bekommst eine Fehlermeldung. Falls du Probleme mit Zeigern hast sinniere mal über diesen Code : procedure test(testObj:TProjektLeistung; PtrObj:Pointer); procedure TIrgendEinForm.test(testObj:TObject;PtrObj:Pointer ) ; var p1,p2:^TObject; begin p1:=PtrObj; p2:=Pointer(testObj); assert(p1=p2); end; Aufruf erfolgt so : o1:TObject; test(o1,Pointer(o1)); |
Re: Problem mit einem Zeiger...
Hi Unwissende, marabu und Muehle..
Ich denke das sollte sich auf alle beziehen: Zitat:
Zitat:
2. Ich werde mir dass absichern (<length> etc.) Zitat:
PS: Kanns ggf. daran liegen, dass diese Form, nicht die aufrufende Form kennt? MfG xZise [edit]sry Hawkeye ^^ Ganz übersehen :P Zitat:
Zitat:
[edit]Boar bin ich doof ^^ Ich muss doch nur die Instanzvariable speichern :D[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz