Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - prüfe ob Prozedurvariable definiert
Symbroson - Mo 09.04.18 20:43
Titel: prüfe ob Prozedurvariable definiert
Hallo EE,
Ich habe mir eine Prozedurvariable angelegt, die abhängig von einer anderen Variable eine andere Funktion enthält. Allerdings bekomme ich immer eine Warnung
'[Warnung] Drawing.pas(653): Variable 'func' ist möglicherweise nicht initialisiert worden'
ich habe es im Code schon mit nem
case .. else abgefangen - hilft aber nichts, und sowie
assigned als auch
= nil sind nicht kompatibel mit einer Prozedur da Delphi's Entwickler sich aus irgendeinem Grund gedacht haben Prozedur auch ohne Klammern aufzurufen.
Also - gibt es eine andere Variante diese Warnung nicht mehr auftauchen zu lassen?
Mir fiele ja spontan noch
exit; ein - aber das soll ja angeblich in manchen Fällen Probleme bereiten.
Und
goto label gefällt den Herren ja auch nicht...
Hier der Codeausschnitt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| type TProcManipColor = procedure(btnTag, x, y: integer; var color: RGBTriple);
procedure TForm1.ManipulateImage(Sender: TObject); var x, y, btnTag: integer; pxl: PRGBTriple; func: TProcManipColor; found: boolean; begin if chkAutoReset.Checked then btnResetClick(Sender);
btnTag := TButton(Sender).Tag; found := true; case btnTag of 1: func := removeColor; 2: func := removeColor; 3: func := removeColor; 4: func := invertColors; 5: func := grayColors; 6: func := grayColorsExt; else found := false; end;
if found then begin for y := 0 to bmp.Height - 1 do begin pxl := bmp.ScanLine[y]; for x := 0 to bmp.Width - 1 do begin func(btnTag, x, y, pxl^); inc(pxl); end; end;
Draw; end; end; |
Delete - Mo 09.04.18 20:59
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson - Mo 09.04.18 22:04
Zitat: |
den Abschnitt ab: if found then ... in der case-Anweisung ausführen lassen |
wie meinst du das? Soll ich in jeder case-Bedingung den Code hinkopieren (oder eben die private prozedur ausführen)?
Delete - Mo 09.04.18 22:43
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson - Mo 09.04.18 22:48
Das else wird doch nur aufgerufen, wenn keiner der Cases mit der Case-Variable übereinstimmt. Das kann doch garnicht funktionieren, tut es auch nicht.
Die Schleifen sollen ja gerade dann ausgeführt werden, wenn func definiert wurde.
Delete - Mo 09.04.18 23:01
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson - Mo 09.04.18 23:11
nun, in diesem Fall kommt wie gesagt der Fehler
Quelltext
1:
| [Fehler] Drawing.pas(648): Nicht genügend wirkliche Parameter |
weil der Delphi-compiler einen Prozeduraufruf erweartet
Delete - Mo 09.04.18 23:14
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson - Mo 09.04.18 23:18
@func <> nil hat funktioniert. vielen Dank ^^
assigned hatte ich auch schon gesagt, dass das nicht funktioniert (gleiches Problem)
ub60 - Di 10.04.18 10:46
Mal noch eine andere Idee - wie wäre es denn mit einer Art Dummy-Zuweisung?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| btnTag := TButton(Sender).Tag; found := true; func := removeColor; case btnTag of 1: func := removeColor; 2: func := removeColor; 3: func := removeColor; 4: func := invertColors; 5: func := grayColors; 6: func := grayColorsExt; else found := false; end; |
Der Fehler taucht doch auf, weil im else-Zweig func mit keinem Wert belegt wird.
ub60
Symbroson - Di 10.04.18 11:07
Naja, wenn ich aus irgendeinem Grund vergessen habe den btn Tag anzupassen hätte das zur Folge, dass die Dummyfunktion ausgeführt wird anstatt eines Fehlers.
Das mit nil finde ich schon optimal - nur wegen dem Vergleich hatte ich Probleme.
ub60 - Di 10.04.18 16:35
Das mit dem NIL finde ich auch besser :D , ich wollte nur noch mal darauf hinweisen, wo der Fehler entsteht.
ub60
Symbroson - Di 10.04.18 16:37
Ich wusste ja, was das Problem war, nur bin ich nicht darauf gekommen den Referenz-Operator @ zu verwenden.
Danke trotzdem :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!