Autor Beitrag
CyDummy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP Pro
D7 Pers
BeitragVerfasst: So 19.01.03 22:53 
Hallöchen!

Warum funktionert der folgende Quellcode nicht?

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
TThumbnailComponent = class(TGroupBox)
protected
  ThumbsList: TStringList; // Namen
published
  // Liste aller Thumbnails
  property Thumbnails: TStringList read ThumbsList write ThumbsList;
end;

constructor TThumbnailComponent.Create(AOwner: TComponent);
begin
  [...]
  ThumbsList := TStringList.Create;
  [...]
end;


Ich hoffe es kann mir jemand helfen, ich sitze nämlich schon den ganzen Tag an dieser Ecke fest...

_________________
LLAP, Cy
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: So 19.01.03 22:57 
Hallo,

was kommt für eine Fehlermeldung?

Liegt es daran, dass ThumbsList als protected und nicht als private deklariert wird?

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
CyDummy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP Pro
D7 Pers
BeitragVerfasst: So 19.01.03 23:38 
Nein, damit hat es wohl nichts zu tun... Ich habe zu dem Thema zwar eine Stelle in meinem schlauen Buch gefunden, die hilft mir allerdings auch nicht weiter:

[...] Dabei können diese Klassen so weit gehen, dass sie zwar eine virtuelle Methode deklarieren, die in allen abgeleiteten Klassen überschrieben wird, dass sie diese selbst jedoch gar nicht implementieren.
Um eine derartige Methode zu deklarieren, die nur als Platzhalter für die Methoden abgeleiteter Klassen dient, können Sie sie mit der Direktive abstract als abstrakte Methode deklarieren.[...]
ausblenden Quelltext
1:
procedure Arbeite; virtual; abstract;					

Diese Deklaration hat den Vorteil, dass Sie die Methode nicht im Implementationsteil der Unit definieren müssen und dass ein Aufruf dieser Methode zu einem Laufzeitfehler mit der Nummer 210 führt, wodurch sichergestellt ist, dass diese Methode nicht versehentlich aufgerufen wird. In Methoden abgeleiteter Klassen, die abstrakte Methoden überschreiben, dürfen Sie daher die geerbte abstrakte Methode auch nicht mit inherited aufrufen.
Beispiele für abstrakte Klassen der VCL sind TStream, TStrings und TPersistent.

_________________
LLAP, Cy
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: So 19.01.03 23:43 
Hallo,

Du brauchst keine Abstrakte-Klassen.

Hast Du bei der Deklaration Deines Objectes den Constructor Create überschrieben?

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
TThumbnailComponent = class(TGroupBox) 
private
  ThumbsList: TStringList; // Namen 
published 
  // Liste aller Thumbnails 
  property Thumbnails: TStringList read ThumbsList write ThumbsList; 
public
  constructor Create(aOwner:TComponent); override;
end; 


constructor TThumbnailComponent.Create(AOwner: TComponent); 
begin 
  inherited Create(aOwner);
  ThumbsList := TStringList.Create; 
  [...] 
end;

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
CyDummy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP Pro
D7 Pers
BeitragVerfasst: Mo 20.01.03 00:44 
Jep, hab ich.

Auch dieser Versuch hat leider nicht funktioniert:
ausblenden 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:
TThumbnailComponent = class(TGroupBox) 
protected 
  ThumbsList: String; // Namen 
  procedure SetThumbsList(New: TStrings);
  function GetThumbsList: TStrings;
published 
  // Liste aller Thumbnails 
  property Thumbnails: TStrings read GetThumbsList write SetThumbsList; 
public 
  constructor Create(aOwner:TComponent); override; 
end; 


constructor TThumbnailComponent.Create(AOwner: TComponent); 
begin 
  inherited Create(aOwner); 
  [...] 
end;

procedure TThumbnailComponent.SetThumbsList(New: TStrings);
begin
  ThumbsList := New.CommaText;
end;

function TThumbnailComponent.GetThumbsList: TStrings;
begin
  Result.CommaText := ThumbsList;
end;

_________________
LLAP, Cy
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 20.01.03 13:34 
Hallo

in deiner thumbnailcomponente existiert keine instanz von Thumblist
und da kann der folgende Aufruf nicht funktionieren
ausblenden Quelltext
1:
2:
3:
4:
procedure TThumbnailComponent.SetThumbsList(New: TStrings);
begin
  ThumbsList := New.CommaText;
end;

erstell eine instanz bei create und im destructor destroy gibst du sie wieder frei
ausblenden Quelltext
1:
2:
3:
4:
function TThumbnailComponent.GetThumbsList: TStrings;
begin
  Result.CommaText := ThumbsList;
end;

geht auch in die Hose. result gibt es auch nicht instanz. Abgesehen ist davon ist der Aufruft falsch, wenn schon, dann Result.CommaText := ThumbsList.commatext.
du kannst dir schnell irgendwo ein speicherloch schaffen,wenn du nicht aufpaßt.statt commatext, kannst du auch die Assign-Methoden verwenden, um die Listen zu kopieren. mit thumblist:=New hast du ein speicherloch.
laß die Getmethode und greif bei read direkt auf die Thumblist zu. die Übergabe kann an einer anderen Stelle,außerhalb, erfolgen
blabla.commatext:=Thumbnailcomponent.thumblist.commatext.
Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)