Wie referenziere ich auf Komponenten, die zur Laufzeit anstatt im Formular-Designer erstellt werden?

8

Ich habe ein kleines Problem. Ich versuche, in Delphi7 eine Liste von Komponenten zur Laufzeit zu erstellen und sie mit dem .OnResize -Ereignis des Formulars zu ändern, aber keine Verwendung ... ich kann nicht herausfinden, wie es geht.

Hier ist mein Code:

%Vor%

Muss ich irgendwie ihre Namen registrieren, um sie im Formular-Event zu verwenden? Oder vielleicht, um eine Klasse zu erstellen und sie einzuschließen?

Jede Art von Hilfe wird wirklich geschätzt! Vielen Dank im Voraus.

    
Dimitris Nats 17.12.2011, 19:56
quelle

3 Antworten

9

Ihre Variablen sind lokal in der Prozedur, in der sie erstellt werden, sodass Sie nicht auf sie verweisen können, wenn Sie diese Variablen außerhalb dieses Verfahrens verwenden. Die Lösung besteht darin, sie Felder der Formularklasse zu machen.

%Vor%

Dann kann Ihr FormResize -Ereignishandler auf sie verweisen.

%Vor%

Vergessen Sie nicht, die lokalen Variablen aus Button1Click zu entfernen und stattdessen die Felder zu verwenden.

%Vor%     
David Heffernan 17.12.2011, 20:15
quelle
4

Obwohl Davids Antwort auch sehr korrekt ist, dachte ich, ich würde mir einen Moment Zeit nehmen und etwas ausführlicher werden. Mit dem Aussehen scheint es, dass Sie mit Delphi sehr neu sind. Es gibt ein sehr häufiges Problem mit Anfängern, auf das David in seiner Antwort nicht eingeht, was das Erstellen und Freigeben dieser Objekte betrifft. Jedes Mal, wenn du jemals "Erstellen" in einer Klasse anrufst, musst du diese Klasse irgendwann auch "freigeben", wenn du damit fertig bist. Wenn Sie nichts freigeben, führt dies zu einem Speicherverlust, und niemand möchte das. Das Freigeben ist genauso einfach wie das Erstellen - bis Sie sich mit dem Thema beschäftigen, eine Liste von Objekten zu führen (die Sie gerade nicht brauchen).

Nehmen wir an, Sie wollten ein Textfeld erstellen ( TEdit ) und es in die Mitte Ihres Formulars setzen. Jetzt können Sie diese Steuerelemente in der Delphi-IDE einfach in Ihrem Formular ablegen, indem Sie nur sicherstellen, dass Sie es wissen. Sie müssen sie nicht unbedingt selbst erstellen / freigeben, es sei denn, es gibt ein spezielles Szenario. Aber das ist gefährlich. Für dieses Beispiel gehen wir davon aus, dass diese TEdit -Steuerung für die gesamte Dauer Ihrer Anwendung vorhanden ist.

Zuerst müssen Sie irgendwo eine Variable für dieses Steuerelement deklarieren. Der sinnvollste Platz hierfür ist innerhalb der Klasse, in der er verwendet wird (in diesem Fall Ihr Formular, das wir Form1 nennen). Stellen Sie sicher, dass Sie nichts über den Abschnitt " private " stellen, wenn Sie mit Variablen (auch "Felder") in Ihrem Formular arbeiten. Alles über private ist für automatisch generierten Code von Delphi für alles gedacht, was in Ihrem Formular gelöscht wurde (und visuell ist). Andernfalls müssen alle manuell erstellten Objekte unter private oder unter public liegen. Der public Bereich wäre ein guter Platz für Ihre Kontrolle ...

%Vor%

Nun, da es erklärt wurde, müssen wir es erstellen (und frei machen). Es ist eine gute Übung, dass Sie jedes Mal, wenn Sie etwas erstellen, sofort den Code eingeben, um ihn auch freizugeben, bevor Sie weiterarbeiten. Erstellen Sie einen Ereignishandler für die OnCreate und OnDestroy -Ereignisse Ihres Formulars ...

%Vor%

Wenn dieses Objekt nicht erstellt wird (vor der Erstellung oder nach der Zerstörung), erhalten Sie eine Zugriffsverletzung, wenn Sie versuchen, es zu verwenden. Dies liegt daran, dass Ihre Anwendung versucht, auf einen Bereich des Computerspeichers zuzugreifen, der nicht zugeordnet ist oder nicht mit dem Typ übereinstimmt, den Sie abrufen möchten.

Nun, das sind die Grundlagen, um dein Szenario zu reparieren. Aber noch eine Sache, um es dir zu zeigen. Angenommen, Sie müssen ein Objekt nur für kurze Zeit für die Dauer einer Prozedur erstellen. Dafür gibt es einen anderen Ansatz. In Ihrem obigen Code haben Sie Ihre Variable direkt in der Prozedur deklariert. Dieses Beispiel zeigt Ihnen, wann dies notwendig ist ...

%Vor%

Sie sehen, solange MyObject nur in diesem einen Aufruf dieser Prozedur verwendet wird, können Sie es hier deklarieren. Aber wenn das Objekt nach Ablauf dieser Prozedur im Gedächtnis bleiben soll, wird es komplizierter. Bleiben Sie in Ihrem Fall dabei, diese in die Klasse des Formulars zu legen, bis Sie mit der dynamischen Erstellung von Objekten vertraut sind.

Eine letzte Anmerkung, wie oben erwähnt, haben Sie die Möglichkeit, die TEdit -Steuer direkt in Ihrem Formular in Entwurfszeit zu platzieren, ohne Ihren eigenen Code zu schreiben. Wenn Sie dies tun, müssen Sie daran denken, NICHT zu versuchen, diese zu erstellen oder zu befreien. Dies ist auch der Fall, wenn Delphi den Code automatisch über den Abschnitt private stellt - wenn etwas mit dem Sie nicht spielen sollen.

    
Jerry Dodge 17.12.2011 20:56
quelle
2

Ich glaube nicht, dass ich dazu berechtigt bin, zu "kommentieren", also formuliere ich das als "Antwort". Wenn Sie die Größe der Laufzeitkomponenten anpassen möchten, wenn die Größe der übergeordneten Elemente geändert wird, sollten Sie sich die Eigenschaft Anchors genauer ansehen. Es kann Ihnen viel Arbeit ersparen.

    
Max Williams 19.12.2011 02:33
quelle

Tags und Links