Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Delphi XE2 - Komponente wird nicht erzeugt/dargestellt


galagher - Di 03.01.12 17:38
Titel: Delphi XE2 - Komponente wird nicht erzeugt/dargestellt
Hallo!

Ich habe eine Komponente TLabeledImage (ist im Package Visual.bpl) selbst entwickelt und konnte sie bisher (Delphi 6) immer nutzen, aber unter Delphi XE2 erhalte ich beim Versuch, sie auf die Form zu ziehen, die Meldung:

Zitat:
Zugriffsverletzung bei Adresse 14F6D116 in Modul 'Visual.bpl'. Lesen von Adresse 000006C.

Im Textfenster darunter:
Zitat:
[14F6D116]{Visual.bpl } LabeledImage.TLabeledImage.GetFont$qqrv (Line 119, "LabeledImage.pas" + 1) + $9
[5008C1A1]{rtl160.bpl } System.TypInfo.GetOrdProp (Line 2027, "System.TypInfo.pas" + 36) + $1
[20FEFB06]{designide160.bpl} ComponentDesigner.FindComponentDependencies (Line 3755, "ComponentDesigner.pas" + 15) + $9
...
Die Liste der Fehler ist noch länger.

Hier Zeile 119 der Datei LabeledImage.pas:

Delphi-Quelltext
1:
2:
3:
4:
function TLabeledImage.GetFont: TFont;
begin
 Result := FLabel.Font;  // <-- Zeile 119
end;
Das Auskommentieren nützt nichts.

Aber ein Formular, das bereits eine Komponente TLabeledImage enthält, lässt sich problemlos öffnen. Also denke ich, Delphi XE2 kann die Kompo zur Designzeit nicht darstellen. Zur Laufzeit kann ich die Kompo erzeugen und auch damit arbeiten.

Muss ich die Kompo vergessen oder kann ich da was machen?


Erichgue - Mi 04.01.12 14:32


Delphi-Quelltext
1:
2:
3:
4:
function TLabeledImage.GetFont: TFont;
begin
 Result := FLabel.Font;  // <-- Zeile 119
end;


Liefert vermutlich NIL zurück.

Ist FLabel beim Aufruf von GetFont instanziert\zugewiesen?

Erich


galagher - Mi 04.01.12 17:15

user profile iconErichgue hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
function TLabeledImage.GetFont: TFont;
begin
 Result := FLabel.Font;  // <-- Zeile 119
end;


Liefert vermutlich NIL zurück.
Ja, offenbar, denn ich hatte, als ich es schaffte, die Komponente auf die Form zu ziehen, die Meldung (sinngemäss): "NIL kann nicht zu TFont zugewiesen werden".

user profile iconErichgue hat folgendes geschrieben Zum zitierten Posting springen:
Ist FLabel beim Aufruf von GetFont instanziert\zugewiesen?
Das dachte ich zumindest, denn bisher hat's ja funktioniert.

Habe jetzt Prozedure SetName komplett entfernt, GetFont habe ich so abgeändert:

Delphi-Quelltext
1:
2:
3:
4:
5:
function TLabeledImage.GetFont: TFont;
begin
  if Assigned(FLabel) then
    Result := FLabel.Font;
end;


Jetzt funktioniert's wieder!


jaenicke - Mi 04.01.12 17:17

Nebenbei als Hinweis:
Du kannst in so einem Fall einfach Delphi beim Package als Hostanwendung eintragen, nen Haltepunkt setzen und kurz nachschauen was los ist. ;-)


galagher - Mi 04.01.12 17:30

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Nebenbei als Hinweis:
Du kannst in so einem Fall einfach Delphi beim Package als Hostanwendung eintragen, nen Haltepunkt setzen und kurz nachschauen was los ist. ;-)
Muss ich mir ansehen!

user profile iconErichgue hat folgendes geschrieben Zum zitierten Posting springen:
Ist FLabel beim Aufruf von GetFont instanziert\zugewiesen?
Wohl nicht, aber warum funktioniert es dann unter D6?

Vor allem:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Das Auskommentieren nützt nichts.
Kann aber sein, dass da noch andere Bedingungen gegeben waren, die ich jetzt behoben habe.


AndyB - Mi 04.01.12 20:04

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
function TLabeledImage.GetFont: TFont;
begin
  if Assigned(FLabel) then
    Result := FLabel.Font;
end;

Wo ist denn da der ELSE Teil?
Denn wenn man sich das ganze über die CPU Anzeige anschaut wird das jetzt zu:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
]function TLabeledImage.GetFont: TFont;
begin
  Result := TFont(Self); // << Speicherüberschreibungen sind da vorprogrammiert
  if Assigned(FLabel) then
    Result := FLabel.Font;
end;


galagher - Mi 04.01.12 23:14

user profile iconAndyB hat folgendes geschrieben Zum zitierten Posting springen:
Wo ist denn da der ELSE Teil?



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function TLabeledImage.GetFont: TFont;
begin
  if Assigned(FLabel) then
    Result := FLabel.Font
  else
    Result := Parent.Font;  //Parent.Font wird dzt. auch ohne diese Zeile von Delphi gesetzt,
end;                        //wenn man die Kompo auf die Form legt

Hab's noch nicht getestet, aber das ist doch die Lösung, oder?


galagher - Do 05.01.12 19:53

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAndyB hat folgendes geschrieben Zum zitierten Posting springen:
Wo ist denn da der ELSE Teil?



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function TLabeledImage.GetFont: TFont;
begin
  if Assigned(FLabel) then
    Result := FLabel.Font
  else
    Result := Parent.Font;  //Parent.Font wird dzt. auch ohne diese Zeile von Delphi gesetzt,
end;                        //wenn man die Kompo auf die Form legt

Hab's noch nicht getestet, aber das ist doch die Lösung, oder?


//Edit:
Korrekt ist:

Delphi-Quelltext
1:
2:
  else
    Result := Font;