Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Komponenten auf einem Register löschen/überprüfen (https://www.delphipraxis.net/203896-komponenten-auf-einem-register-loeschen-ueberpruefen.html)

mdittrich 4. Apr 2020 12:09

Komponenten auf einem Register löschen/überprüfen
 
Hallo zusammen,
ich habe eine Funktion, die Felder in meinem Programm löscht bzw. überprüft, ob sie leer sind (vor dem Speichern).
Jetzt durchlaufe ich alle Felder und überprüfe, ob der Komponentennamen einen Teilstring enthält (Alle Komponenten(Name) auf dem Register Einstellungen enthalten zum Beispiel _Einstellung_).

Ich möchte das aber etwas beschleunigen. Meine Idee:

ich übergebe eine Komponente (zum Beispiel: TAdvOfficePager). Hier liegen jetzt Panel, Gridbox und so weiter drauf. Diese enthalten jetzt meine TEdit, Tcombobox usw.

In der Funktion möchte ich jetzt TAdvOfficePager übergeben + TEdit und ob es gelöscht oder überprüft werden soll. Es sollen aber alle Felder auf dem TAdvOfficePager gefunden werden.

Hat einer einen Tipp?

Danke und bleibt gesund

Maik



Delphi-Quellcode:
function Tf_menue.f_Felder_ueberpruefen(sRegister:string;boLöschen:boolean):Boolean;
begin
   Result:= false;
   //alle Felder durchlaufen und prüfen, ob das richtige Register erreicht ist
   for iPuffer := 0 to ComponentCount-1 do
   begin
      if boLöschen = true then
      begin
         if Components[iPuffer] is TAdvEdit then
         begin
            if pos(sRegister,(Components[iPuffer] as TAdvEdit).Name) > 0 then
            begin
               (Components[iPuffer] as TAdvEdit).Text := '';
               (Components[iPuffer] as TAdvEdit).Color := clWindow;
            end;
         end;
      end
      else
      begin
         if Components[iPuffer] is TAdvEdit then
         begin
            if pos(sRegister,(Components[iPuffer] as TAdvEdit).Name) > 0 then
            begin
               if (Components[iPuffer] as TAdvEdit).Text = '' then
               begin
                  (Components[iPuffer] as TAdvEdit).Color := $00AFB0EB;
                  Result := true;
               end
               else
                  (Components[iPuffer] as TAdvEdit).Color := clWindow;
            end;
         end;
      end;
   end;

himitsu 4. Apr 2020 12:33

AW: Komponenten auf einem Register löschen/überprüfen
 
.Components ist was, wo die Unterkomponenten das als Owner haben.
.Controls ist das entsprechende für die Beziehung des Parent.

Entweder beim manuellen Create den passenden Owner benutzen,
oder nur die Unterkomponenten durchlaufen (z.B. in einem Panel/Groupbox usw.), anstatt Allem auf der Form.


Zitat:

Delphi-Quellcode:
if ... = True then

Wen sollen wir dafür steinigen?

Eine Funktion "prüfen", die löscht?
Mach dir das Leben einfacher und mach besser zwei Methoden daraus. (wird übersichtlicher und das fast ohne eine Zeile mehr Code)


Und das POS: Wirklich "irgendwo" prüfen?
Oder ist hier doch eher
Delphi-Quellcode:
Pos(...) = 1
gemeint?
Delphi-Quellcode:
if (Components[iPuffer] is TAdvEdit) and StartsStr(sRegister, Components[iPuffer]) then // oder StartsText

mdittrich 4. Apr 2020 17:29

AW: Komponenten auf einem Register löschen/überprüfen
 
Hallo himitsu,

danke für den Tipp probiere ich später gleich mal aus.
Das mit dem Pos > 0 war so gemeint, da der Name zum Beispiel: le_Einstellungen_Passwort heißen kann.

Noch eine Frage zu if = true then. Meist du damit:

if boLöschen = true then soll ich so schreiben: if boLöschen then?

Danke für die Hilfe

Maik

mdittrich 4. Apr 2020 21:40

AW: Komponenten auf einem Register löschen/überprüfen
 
Ich habe jetzt folgendes gefunden und auf meine Bedürfnisse angepasst.
Leider bekomme ich in Zeile 10 einen Fehler, sobald es sich um eine Komponente wie TAdvEdit handelt.

Aufbau auf dem Form:
1. TAdvOfficePAge (Wird in der Funktion als wcKomponente übergeben)
2. --> TGridPanel
3. ------> TAdvGroupBox
4. ---------> TAdvConboBox (Hier tritt jetzt der Fehler auf, beim Durchlauf der Schleife.)

01. function Tf_menue.f_FindControls(wcKomponente: TWinControl; cKomponente: TClass; boRecurse: Boolean):boolean;
02. // wcKomponente = die Komponente in der Gesucht werden soll zum Beipsiel p_Einstellungen
03. // cKomponente = Komponente nach der gesucht werden soll
04. // boRecurse = soll auch in den unterkomponenten gesucht werden p_Einstellungen -> p_Panel -> groupbox
05. var
06. ccKomponente: TWinControl;
07. begin
08. for iPuffer := 0 to Pred(wcKomponente.ControlCount) do
09. begin
10. ccKomponente := wcKomponente.Controls[iPuffer] as TWinControl;
11. if ccKomponente is cKomponente then
12. begin
13. (ccKomponente.Controls[iPuffer] as TAdvEdit).Text := '';
14. (ccKomponente.Controls[iPuffer] as TAdvEdit).Color := clWindow;
15. end;
16. if boRecurse and (ccKomponente.ControlCount > 0) then
17. f_FindControls(ccKomponente, cKomponente, boRecurse);
18. end;
19.end;

Was kann ich machen, um diesen Fehler abzufangen und die Edits zu löschen.

Danke

Maik

Redeemer 4. Apr 2020 22:26

AW: Komponenten auf einem Register löschen/überprüfen
 
Übrigens solltest du nicht "Ich bekomme einen Fehler." schreiben, sondern "Ich bekomme folgenden Fehler: Ungültige Typumwandlung."

Und was der bedeutet, ist doch klar, oder? Man muss vorm Typumwandeln immer prüfen, ob man das darf (
Delphi-Quellcode:
is
).

Dennis07 6. Apr 2020 08:22

AW: Komponenten auf einem Register löschen/überprüfen
 
Zitat:

Zitat von mdittrich (Beitrag 1461254)
Delphi-Quellcode:
boLöschen

:roteyes:

Für diesen Fall müsste es eigentlich einen eigenen Smiley geben...

himitsu 6. Apr 2020 10:18

AW: Komponenten auf einem Register löschen/überprüfen
 
Zitat:

Zitat von Dennis07 (Beitrag 1461366)
Für diesen Fall müsste es eigentlich einen eigenen Smiley geben...

Seit 2009 ist das kein Problem.
Kannst auch Chinesich nutzen. (mit nur noch einem Zeichen pro Funktion, Variable, Typ usw. wird der Code ser viel kürzer und übersichtlicher)

p80286 6. Apr 2020 10:35

AW: Komponenten auf einem Register löschen/überprüfen
 
Zitat:

Zitat von mdittrich (Beitrag 1461272)
Noch eine Frage zu if = true then. Meist du damit:

if boLöschen = true then soll ich so schreiben: if boLöschen then?

Genau! und wenn Du noch einen Bogen um Umlaute machst, und nach Möglichkeit engl. Bezeichner verwendest, verstehen Dich gleich nicht nur deutschsprachige Programmierer.

Gruß
K-H

Incocnito 6. Apr 2020 16:50

AW: Komponenten auf einem Register löschen/überprüfen
 
Zitat:

Zitat von himitsu (Beitrag 1461377)
...Kannst auch Chinesich nutzen. (mit nur noch einem Zeichen pro Funktion, Variable, Typ usw. wird der Code ser viel kürzer und übersichtlicher)

Du machst mich fertig! :shock: :lol:

Dennis07 6. Apr 2020 16:56

AW: Komponenten auf einem Register löschen/überprüfen
 
Zitat:

Zitat von himitsu (Beitrag 1461377)
Seit 2009 ist das kein Problem.
Kannst auch Chinesich nutzen. (mit nur noch einem Zeichen pro Funktion, Variable, Typ usw. wird der Code ser viel kürzer und übersichtlicher)

Jo, kann man natürlich. Heißt aber nicht, dass ich es so machen würde. :-D:-D:-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:12 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