Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Controls wärend der Laufzeit ENTFERNEN. (https://www.delphipraxis.net/103191-controls-waerend-der-laufzeit-entfernen.html)

tomate007 12. Nov 2007 09:26


Controls wärend der Laufzeit ENTFERNEN.
 
Hallo Gemeinde,
ich hab da mal wieder ein kleines Problem ^^

und zwar möchte ich wärend der Laufzeit Controls entfernen.
In der Code Libery habe ich schon was zum entfernen der Codes wärend der Laufzeit gefunden, allerdings entfernt da sich der Control selber.

Ich bräuchte allerdings eine Procedure mit der Ich andere Button killen kann, d.h.

Klickt einer auf Button1 soll in der ScrollBox1 die Button 2 und 3 entfernt werden.

Leider habe ich den Code aus der Code Libery nicht umschreiben können das es funktioniert.... bin denk ich ma zu doof :D

Hoffe es kann mir einer helfen

Link zur CodeLibery: http://www.delphipraxis.net/internal...ct.php?t=29732

MFG
Andre

mkinzler 12. Nov 2007 09:30

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Wie hast du es versucht?

marabu 12. Nov 2007 09:30

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Hallo Andre,

es ist so einfach:

Delphi-Quellcode:
procedure TDemoForm.Button1Click(Sender: TObject);
begin
  Button2.Free;
  Button3.Free;
end;
Grüße vom marabu

Deep-Sea 12. Nov 2007 09:45

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von tomate007
Klickt einer auf Button1 soll in der ScrollBox1 die Button 2 und 3 entfernt werden.

Entfernen? Die Anwendung interessiert mich doch mal :P Sicher, das "verstecken" nicht ausreicht? ...

tomate007 12. Nov 2007 11:03

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von Deep-Sea
Zitat:

Zitat von tomate007
Klickt einer auf Button1 soll in der ScrollBox1 die Button 2 und 3 entfernt werden.

Entfernen? Die Anwendung interessiert mich doch mal :P Sicher, das "verstecken" nicht ausreicht? ...

Doch, die müssen ENTFERNT werden. Da die nachher wieder neu erzeugt werden und delphi sonst mekkert das Edit1 schon vorhanden ist also von dahher muüssen die dynamisch erzeugten felder wieder gelöscht werden bevor diese wieder dynamisch erzeugt werden können.

Aber die Lösung von marabu funktioniert ^^ so einfach ist es also... danke euch :D

Deep-Sea 12. Nov 2007 11:27

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von tomate007
Doch, die müssen ENTFERNT werden. Da die nachher wieder neu erzeugt werden [...]

Genau das meine ich ja. Erst freigeben, dann wieder erzeugen, freigeben, erzeugen, usw. Sieht halt aus, als wäre es wie geschaffen für TControl.Hide und TControl.Show ^^ Ist halt die Frage, warum sie unbedingt freigegeben und neu erzeugt werden müssen ...

tomate007 12. Nov 2007 12:21

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Also die müssen meiner Meinung nach neu erzeugt werden da die Situation so aussieht:

Alle Felder und Labels werden dynamisch aus einer CSV erzeugt.
Diese CSV wird durch ein anderes Programm wärend der Laufzeit geändert.
d.h. der Inhalt aus der ersten Zelle der CSV wird in Edit1 geschrieben und die überschrift dazu in Label1.
dies kann aber sich alles wärend der Laufzeit ändern, sodass ich wenn der User auf Aktuallisieren klickt nicht weiß ob die Caption von Label 1 immernoch die Überschrift der Spalte 1 ist und ich weiß auch nicht ob der Inhalt von Edit1 immernoch der gleiche Inhalt ist wie Zelle 1 der CSV.

Desweiteren weiß ich vorher nicht ob die CSV nicht vllt nach dem Aktuallisieren Leer ist, oder ob da noch Spalten zugekommen ist.

Da ich soviele Sachen nicht weiß, dachte ich mir das ein destroy und nachher wieder erzeugen besser wäre als tausende von Prüfungen und anschließend die dazugekommenden zu erzeugen.

Bin natürlich offen für alle Ideen, also wenn einer was besseres weiß als .free und dann wieder erzeugen immer her damit.

Dazu kommt noch das .free sehr sehr langsam ist. Also das .free mach ich gerade so:
Delphi-Quellcode:
     if pruefung = true then begin
     for i:= 1 to AnzahlSpalten-1 do begin
     TEdit(Scrollbox1.FindComponent('Edit'+ IntToStr(i))).Free;
     TLabel(Scrollbox1.FindComponent('Label'+ IntToStr(i))).Free;
     end;
     end;
dabei ist pruefung eine variable des typ boolean welche auf true gesetzt wird wenn 1mal felder erzeugt wurden.
AnzahlSpalten ist die Anzahl der Spalten der CSV wovon ich vorher (bevor die CSV durch ein anderes Programm verändert worden ist) die Objects erzeugt habe. Mit AnzahlSpalten weiß ich also wieviele Objects ich zu löschen habe.

mit FindComponents suche ich mir die dann raus da ich ja die Objects nicht mit Edit[i] oder Label[i] ansprechen kann oder??

nun klappt alles, aber ich habe bei der .free Methode eine CPU-Auslastung von 100 % also geht alles zu langsam. Gibt es eine bessere Möglichkeit???

So .... nun seit ihr wieder gefragt ^^

Danke schonmal :D

MFG
Andre

marabu 12. Nov 2007 12:30

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Richtig rechenintensiv ist eigentlich nur FindComponent() - eine Methode, die du hier wirklich missbrauchst. Sie ist in erster Linie zur Unterstützung von Interaktionen gedacht, wo ihr Laufzeitverhalten von der Arbeitsgeschwindigkeit des Benutzers überdeckt wird.

Warum verwendest du kein Grid oder eine ListView für deine CSV-Daten?

Deep-Sea 12. Nov 2007 12:32

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Na dann ergibt es schon mehr Sinn ;)
Was ein besserer und/oder schnellerer Weg wäre, kommt darauf an, wie genau die Edits und Labels dargestellt werden. Vlt. wäre ein Liste ya besser?! :wink:

PS: Das casten bei FindComponent kannst du dir sparen, jedes TObject kennt .Free ^^

tomate007 12. Nov 2007 12:48

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von marabu
Richtig rechenintensiv ist eigentlich nur FindComponent() - eine Methode, die du hier wirklich missbrauchst. Sie ist in erster Linie zur Unterstützung von Interaktionen gedacht, wo ihr Laufzeitverhalten von der Arbeitsgeschwindigkeit des Benutzers überdeckt wird.

Warum verwendest du kein Grid oder eine ListView für deine CSV-Daten?

Also im Geheimen verwände ich ja ein StringGrid, in dem ich dann die CSV reinlade und mir dann die Anzahl der Spalten und Zeilen sowie die Überschriften der Spalten auslese und mit diesen Daten dann halt die Objects erzeuge.
Nur da die CSV aktuallisiert wird wärend der Laufzeit muss ich dann wenn der User auf den Button aktuallisieren klickt die CSV einlesen in das StringGrid und dann halt wieder die Objects neu erzeugen.


Zitat:

Zitat von Deep-Sea
Na dann ergibt es schon mehr Sinn ;)
Was ein besserer und/oder schnellerer Weg wäre, kommt darauf an, wie genau die Edits und Labels dargestellt werden. Vlt. wäre ein Liste ya besser?! :wink:

PS: Das casten bei FindComponent kannst du dir sparen, jedes TObject kennt .Free ^^


OK, das casten hab ich wieder weggenommen. Aber ist natürlich immernoch alles langsam.

Und FindComponent() brauch ich ja weil ich muss doch irgendwie alle Labels und Edits "löschen"... wie soll ich es sonst machen wenn nicht mit FindComponent?

Ich will keinen Missbrauchen aber ich sehe keine andere Möglichkeit.... aber diese hier ist zu langsam.
Da brauch ich mal gute Ideen :D

Eine Liste ist nicht zu machen, der Kunde MÖCHTE vorne nen Label mit der Spaltenüberschrift und dahinter dann ein Edit.

Und was der Kunde möchte... das bekommt er ^^

MFG
Andre

PS: HELFT MIR BITTE :D :D

marabu 12. Nov 2007 12:56

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Du kannst einfach über alle Komponenten in deiner ScrollBox (rückwärts) iterieren und die gefundenen Edit- und Label-Komponenten freigeben. Wenn sich da keine anderen Komponenten befinden, geht das sogar ohne Typprüfung. Auf jeden Fall wird so das mehrfache Durchgehen der Liste via FindComponent vermieden. Dass auch Free() nicht ganz ohne Kosten ist, versteht sich von selbst.

Deep-Sea 12. Nov 2007 13:06

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von tomate007
Eine Liste ist nicht zu machen, der Kunde MÖCHTE vorne nen Label mit der Spaltenüberschrift und dahinter dann ein Edit.

Controls sind nun mal nicht gedacht, als Liste missbraucht zu werden. Bei einigen Zeilen mag dies noch gehen, aber irgendwann ist der Overhead den die Controls erzeugen so extrem, dass kein PC der Welt da noch schnell genug wäre. (Eine Möglichkeit wäre noch, nur so viele Controls zu erzeugen, wie sichtbar sind. Und beim "scrollen" immer wieder mit dem Daten füllen...)
Kunden haben in der Regel nicht viel Ahnung von Softwareentwicklung, darum kommen sie ja zu "uns". Du schreibst einem Maurer auch nicht vor, wie er den Mörtel zu verarbeiten hat - denn er sollte es am besten wissen. Also falls die Daten über ein (tief liegendes) Maximum reichen, musst du wohl deinem Kunden klar machen, das diese Lösung so nicht praktikabel ist. Man kann auch ohne all zu großen Aufwand Listen erstellen, die sich optisch kaum von einer "Label-Edit"-Lösung unterscheiden, aber extrem viel mehr Performance haben ...

[edit] Falls du Align nutzt, mache auf jeden Fall DisableAlign und EnableAlign! :wink: [/edit]

tomate007 12. Nov 2007 13:40

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von marabu
Du kannst einfach über alle Komponenten in deiner ScrollBox (rückwärts) iterieren und die gefundenen Edit- und Label-Komponenten freigeben. Wenn sich da keine anderen Komponenten befinden, geht das sogar ohne Typprüfung. Auf jeden Fall wird so das mehrfache Durchgehen der Liste via FindComponent vermieden. Dass auch Free() nicht ganz ohne Kosten ist, versteht sich von selbst.

Das hört sich doch gut an... ich bräuchte ne prozedur die ALLE Componenten auf der ScrollBox entfernt mit .free... ist das dann schneller??? Also... deine idee ist super denn ich habe da nicht andere Componenten drauf.

Könntest du/ihr mir sagen wie ich das machen kann?? kann ich sowas wie

On all Objects in ScrollBox do .free

^^

ich weiß... warscheinlich zu einfach :D


Zitat:

Zitat von Deep-Sea
Controls sind nun mal nicht gedacht, als Liste missbraucht zu werden. Bei einigen Zeilen mag dies noch gehen, aber irgendwann ist der Overhead den die Controls erzeugen so extrem, dass kein PC der Welt da noch schnell genug wäre. (Eine Möglichkeit wäre noch, nur so viele Controls zu erzeugen, wie sichtbar sind. Und beim "scrollen" immer wieder mit dem Daten füllen...)[...]

[edit] Falls du Align nutzt, mache auf jeden Fall DisableAlign und EnableAlign! :wink: [/edit]


Also der Kunde ist ein interner Mitarbeiter und MÖCHTE ES SO HABEN ohne wenn und aber. Und da ich in der Ausbildung bin hab ich nichts zu melden und muss es halt so machen....

Ach ja... ist alles nicht so einfach ^^

Bin ja froh das ihr mir helft.

MFG
Andre

Deep-Sea 12. Nov 2007 13:48

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von tomate007
On all Objects in ScrollBox do .free

Delphi-Quellcode:
With ScrollBox123 do
  While ControlCount > 0 do Controls[0].Free;
Zitat:

Zitat von tomate007
Also der Kunde ist ein interner Mitarbeiter und MÖCHTE ES SO HABEN ohne wenn und aber. Und da ich in der Ausbildung bin hab ich nichts zu melden und muss es halt so machen....

Dann muss er damit leben, das es pro Aktualisierung 2 Minuten dauert :evil: :P
(Oder eben nur so viele Controls erzeugen, wie sichtbar sind und dynamisch beim scrollen laden ...)

tomate007 12. Nov 2007 14:00

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von Deep-Sea
Zitat:

Zitat von tomate007
On all Objects in ScrollBox do .free

Delphi-Quellcode:
With ScrollBox123 do
  While ControlCount > 0 do Controls[0].Free;
Zitat:

Zitat von tomate007
Also der Kunde ist ein interner Mitarbeiter und MÖCHTE ES SO HABEN ohne wenn und aber. Und da ich in der Ausbildung bin hab ich nichts zu melden und muss es halt so machen....

Dann muss er damit leben, das es pro Aktualisierung 2 Minuten dauert :evil: :P
(Oder eben nur so viele Controls erzeugen, wie sichtbar sind und dynamisch beim scrollen laden ...)


DANKÖÖÖÖÖÖÖÖSCHÖÖÖNNN

Es funktioniert!!!!!
:dp: :dancer2: :hello:

Ich danke euch allen....:D

QuickAndDirty 12. Nov 2007 14:01

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von tomate007
Delphi-Quellcode:
     if pruefung = true then begin
     for i:= 1 to AnzahlSpalten-1 do begin
     TEdit(Scrollbox1.FindComponent('Edit'+ IntToStr(i))).Free;
     TLabel(Scrollbox1.FindComponent('Label'+ IntToStr(i))).Free;
     end;
     end;

SO GEHT DAS NICHT
wenn du die erste gelöscht hast gibt es die letze schon nicht mehr.

machs so
Delphi-Quellcode:
     if pruefung = true then
     begin
       for i:= AnzahlSpalten-1 downto 1 do
       begin
         TEdit(Scrollbox1.FindComponent('Edit'+ IntToStr(i))).Free;
         TLabel(Scrollbox1.FindComponent('Label'+ IntToStr(i))).Free;
       end;
     end;

Deep-Sea 12. Nov 2007 14:04

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von QuickAndDirty
Zitat:

Zitat von tomate007
Delphi-Quellcode:
     if pruefung = true then begin
     for i:= 1 to AnzahlSpalten-1 do begin
     TEdit(Scrollbox1.FindComponent('Edit'+ IntToStr(i))).Free;
     TLabel(Scrollbox1.FindComponent('Label'+ IntToStr(i))).Free;
     end;
     end;

SO GEHT DAS NICHT
wenn du die erste gelöscht hast gibt es die letze schon nicht mehr.

Oh doch das geht. Nur weil man "Edit1" freigibt, bleibt "Edit5" immer noch "Edit5" :wink: Er greift ja nicht über einen Index auf die Komponente zu, sondern über den Namen ...

Phoenix 12. Nov 2007 14:04

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Eine andere Idee wäre es gewesen, im Hintergrund eine ObjectList zu benutzen.
Beim Erzeugen Deiner Controls packst Du einfach eine Referenz in diese Liste und beim Freigeben musst Du dann nur einmal durch diese Liste durchrennen und alle Controls freigeben, die da drin stecken.

Somit ersparst Du Dir auch das FindComponent.

Deep-Sea 12. Nov 2007 14:06

Re: Controls wärend der Laufzeit ENTFERNEN.
 
Zitat:

Zitat von Phoenix
Eine andere Idee wäre es gewesen, im Hintergrund eine ObjectList zu benutzen.
Beim Erzeugen Deiner Controls packst Du einfach eine Referenz in diese Liste und beim Freigeben musst Du dann nur einmal durch diese Liste durchrennen und alle Controls freigeben, die da drin stecken.

Somit ersparst Du Dir auch das FindComponent.

Da sich in der ScrollBox eh nur die besagten Komponenten befinden, ist das nun nicht mehr nötig :P


Zitat:

Zitat von tomate007
Es funktioniert!!!!!

Was hast du erwartet?! :mrgreen:

tomate007 12. Nov 2007 14:15

Re: Controls wärend der Laufzeit ENTFERNEN.
 
also jungs... es funktioniert alles mit:

Delphi-Quellcode:
With ScrollBox123 do
  While ControlCount > 0 do Controls[0].Free;
und zwar ist es so das alle Componenten die gelöscht werden sollen sich soweso in ScrollBox123 befinden.

Von daher klappt es super...



Zitat:

Zitat von QuickAndDirty
Zitat:

Zitat von tomate007
Delphi-Quellcode:
     if pruefung = true then begin
     for i:= 1 to AnzahlSpalten-1 do begin
     TEdit(Scrollbox1.FindComponent('Edit'+ IntToStr(i))).Free;
     TLabel(Scrollbox1.FindComponent('Label'+ IntToStr(i))).Free;
     end;
     end;

SO GEHT DAS NICHT
wenn du die erste gelöscht hast gibt es die letze schon nicht mehr.

machs so
Delphi-Quellcode:
     if pruefung = true then
     begin
       for i:= AnzahlSpalten-1 downto 1 do
       begin
         TEdit(Scrollbox1.FindComponent('Edit'+ IntToStr(i))).Free;
         TLabel(Scrollbox1.FindComponent('Label'+ IntToStr(i))).Free;
       end;
     end;

Genau, wie Deep-Sea schon geschrieben hat geh ich da auf den Namen und nicht auf den Index, nur natürlich war dies zu langsam da ich die FindComponent-Sache mit drin hatte welche, wie ich es heut gelernt habe, sehr sehr langsam ist.

Würde jedem empfehlen der viele Componenten, dass er einfach nen panel macht und da die dinger drauf setzt die entfernt werden sollen und dann halt mit dem Code oben die Objects löscht.

Zitat:

Zitat von Deep-Sea
Zitat:

Zitat von tomate007
Es funktioniert!!!!!

Was hast du erwartet?! :mrgreen:

Naja... das es klappt wenn der Code schon von einem Deep-Sea kommt dann muss er ja klappen :? :D


Also nochmal


ICH DANKE EUCH ALLEN!!!!

MFG
Andre

@Mod Thema kann geschlossen werden von meiner Seite aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz