Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - prüfe ob Prozedurvariable definiert


Symbroson - Mo 09.04.18 21: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 21:59

- Nachträglich durch die Entwickler-Ecke gelöscht -


Symbroson - Mo 09.04.18 23: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 23:43

- Nachträglich durch die Entwickler-Ecke gelöscht -


Symbroson - Mo 09.04.18 23: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 - Di 10.04.18 00:01

- Nachträglich durch die Entwickler-Ecke gelöscht -


Symbroson - Di 10.04.18 00: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 - Di 10.04.18 00:14

- Nachträglich durch die Entwickler-Ecke gelöscht -


Symbroson - Di 10.04.18 00:18

@func <> nil hat funktioniert. vielen Dank ^^

assigned hatte ich auch schon gesagt, dass das nicht funktioniert (gleiches Problem)


ub60 - Di 10.04.18 11: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; // hier als Dummy-Zuweisung
  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 12: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 17: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 17:37

Ich wusste ja, was das Problem war, nur bin ich nicht darauf gekommen den Referenz-Operator @ zu verwenden.
Danke trotzdem :)