2010-11-29 16 views
6

Was ist das Besondere an Frames, dass wenn Sie sie Laufzeit erstellen, es automatisch einen Namen zugewiesen bekommt? Dies verursacht ein Problem, wenn man sich in einer Schleife verwendet das heißt:Frame-Namen werden automatisch zugewiesen

for i := 0 to 3 do 
    TMyFrame.Create(self); //Error on 2nd pass 

Beim ersten Durchlauf wird der Rahmen explicityl namens ‚MyFrame‘. Im zweiten Durchlauf wird es versuchen, es wieder 'MyFrame' zu nennen, was offensichtlich eine Ausnahme verursacht, da es bereits eine Komponente mit einem solchen Namen gibt.

Die anderen Komponenten oder Formulare sind gerne erstellt ohne ich ihnen einen Namen zuweisen. Was gibt ?

Dies ist auf Delphi 2006 BTW.

Prost

Antwort

1

Sie versuchen, den gleichen Rahmen 4 Mal, jedes Mal, wenn Sie den Rahmen erstellen erstellen wird es den gleichen Namen ist

... 
var 
    i: Integer; 
    lFrame: TFrame; 
begin 
    for i := 0 to 3 do begin 
    lFrame := TFrame.Create(Self); 
    // assign a unique name to the frame 
    lFrame.Name := Format('MyFrame%d', [i]); 
    // set the parent, align, etc... 
    end; 
end; 
+2

Ich glaube seine Frage ist _why_ er muss dies mit Frames machen, wenn er es nicht mit anderen Komponenten machen muss. –

+0

Ich bekomme das Dorin. Ich bin mir sicher, dass es Möglichkeiten gibt. Aber die Frage ist warum? Delphi ist damit einverstanden: für i: = 0 bis 5 do TButton.Create (self); – Rick

+1

weil der Rahmen ein Abkömmling Ihrer benutzerdefinierten Klasse ist ?! – ComputerSaysNo

3

haben, eine Möglichkeit zu vermeiden, wenn Sie verwenden TFrame, um Ihren Frame zu erstellen, dann wird dieser Fehler nicht ausgelöst.

das heißt, wenn Ihr Code wie folgt aussieht, haben Sie nicht irgendwelche Probleme

for i := 0 to 3 do 
    Frame1 := TFrame.Create(self); 

weil hier die Name-Eigenschaft nicht zugewiesen ist. Wenn Sie möchten, dass Sie mit Hilfe der Anweisung überprüfen ShowMessage(Frame1.Name);

Aber wenn Sie verwenden TMyFrame das heißt, der Rahmen, die Sie von TFrame abgeleitet, dann wird es das Problem gibt.

Ich denke der Grund ist, dass Delphi bei jedem Erstellen des TMyName explizit denselben Namen zugewiesen hat.

+0

danke zur Verdeutlichung - ich war sooo müde ;-) sehr gute Antwort !! – ComputerSaysNo

0

Zufälligerweise bin ich (wieder) zufällig auf mich gestoßen.

Wenn Sie den Namen aus deinem Rahmenkomponente dann Delphi stöhnt, dass „Root-Komponente muss einen Namen haben“ - ich denke, es da irgendwo Delphi RegisterClass(RootComponentName) ruft und dann zu erstellen (oder ein Nachkomme) es ruft Findclass(RootComponentName) oder ähnlich. Da Sie dies selbst tun können, um Komponenten zu erstellen, von denen Sie den Klassennamen einer Entwurfszeit nicht kennen, warum würde Delphi nicht dasselbe tun?

Während mit einem TButton usw. ist es bereits eine registrierte Klasse.

Verwandte Themen