Uruz Geschrieben 8. April 2002 Geschrieben 8. April 2002 Aloha ihr lieben Leute... ich hab ein kleines Problem in Delphi6... ich will alle Komponenten auf dem Formular durchlaufen und wenn die Komponente einem der 4 Typen entspricht, die ich da aufzaehle, moechte ich eine Fehlerpruefung machen. Der oben daregstellte Weg funktioniert, gefaellt aber meinem Chef ned... kann man folgenden Text nicht auch irgendwie zusammenfassen : for ilvLoop := 0 to ComponentCount - 1 do begin If ( Components[ilvLoop] Is TEdit ) or ( Components[ilvLoop] Is TCheckBox ) or ( Components[ilvLoop] Is TRadioGroup ) or ( Components[ilvLoop] Is TDBLookupComboBox ) then If ( Pruefe( Components[ilvLoop] As TWinControl ) = TRUE ) Then Exit; end; so wie in etwa: Type TEFeld = (TCheckBox, TDBLookUpComboBox, TEdit, TRadioGroup); .... for ilvLoop := 0 to ComponentCount - 1 do begin If ( Components[ilvLoop] in TEFeld ) then If ( Pruefe( Components[ilvLoop] As TWinControl ) = TRUE ) Then Exit; end; muss doch irgendwie gehen.... aber klappt nicht... hab das gefuehl, dass ich irgendwas ganz offensichtliches glatt weg uebersehe... *gruebel* dank euch... Uruz Zitieren
Pointerman Geschrieben 8. April 2002 Geschrieben 8. April 2002 Hallo Uruz, also ganz billig wäre folgendes: gib einfach den gewünschten Komponenten in der "Tag" Eigenschaft einen Wert an dem Du sie identifizieren kannst, dann kannst Du einfach prüfen ob der Wert z.B. =1 ist und musst nich auf alle Typen durchprüfen. Ich holfe das hilft Dir irgendwie... mfg Maart Zitieren
Uruz Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 aloha... wollt auf den tag verzichten... der wird hier schon fuer andere sachen verwendet ;o) daher muss ich eine andere moeglichkeit finden.. Uruz Zitieren
lpd Geschrieben 8. April 2002 Geschrieben 8. April 2002 Type TEFeld = (TCheckBox, TDBLookUpComboBox, TEdit, TRadioGroup); .... for ilvLoop := 0 to ComponentCount - 1 do begin If ( Components[ilvLoop] in TEFeld ) then If ( Pruefe( Components[ilvLoop] As TWinControl ) = TRUE ) Then Exit; end; Nun, der Ansatz ist sicherlich richtig, du deklariert ein Array und schreibst die benötigten Werte einfach rein. Auch die Abfrage nach dem Vorhandensein in diesem Array ist korrekt. Kopfzerbrechen bereitet mir jedoch diese Zeile : If ( Pruefe( Components[ilvLoop] As TWinControl ) = TRUE ) Zunächst einmal : Wenn es sich bei der "Pruefe" um eine Funktion mit boolschem Rückgabewert handelt, genügt es, wenn du es so schreibst : If Prüfe (Parameter) then Exit; Aber mich interessiert, was diese Funktion tut. Zitieren
Uruz Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 die Funktion Pruefe(Sender : TWinControl) : boolean prueft nur den Inhalt der uebergebenen Komponente... wenn es sich um ein Editfeld handelt... ob Inhalt drin steht... oder ob die Kombination schon vergeben ist... bzw. bei den Checkboxen bzw Radiogroup-Items, ob der Wert gesetzt werden darf... es geht darum, dass ich die Daten auf dem Formular ueberpruefen will um sie spaeter in eine Datenbank zu uebertragen. Nun ja, und mein chef besteht darauf, dass fuer alle Komponenten nur eine Funktion zum pruefen verwendet werden soll. Nur kurz so am Rande... so wie ich es weiter oben aufgefuehrt habe, laesst es sich nicht machen... da liefert mir delphi nur den Fehler Operator ist auf den Operandentyp nicht anwendbar hab auch schon versucht TEFeld als set of zu definieren, aber mit dem gleichen Erfolg... *seufz* und das ich if Pruefe(...) then schreiben kann, weiss ich, nur Chef findet es so uebersichtlicher... *seufz* Zitieren
lpd Geschrieben 8. April 2002 Geschrieben 8. April 2002 Original geschrieben von Uruz Operator ist auf den Operandentyp nicht anwendbar In welcher Zeile an welcher Stelle genau ? Zitieren
Uruz Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 Also... wenn ich type TEFeld = (TCheckBox, TDBLookUpComboBox, TritEdit, TRadioGroup); in der gleichen Unit habe, beklagt er sich schon bei jeder Verwendung und auch bei der Definition der 4 Komponenten Fehlermeldung bei var chbGeloescht : TCheckBox; '..' erwartet, aber ';' gefunden an der Stelle for ilvLoop := 0 to ComponentCount - 1 do begin If ( Components[ilvLoop] In TEFeld)<- then kommt die Fehlermeldung '(' erwartet, aber ')' gefunden[/color=red] und bei If<-( bpfFehl( Components[ilvLoop] As TWinControl) = TRUE ) Then Exit;<- Operator oder Semikolon fehlt Operator ist auf diesen Operandentyp nicht anwendbar wenn ich die Typendeklaration in einer anderen querverbundenen Unit habe, in der gewoehnlich die allgemeingueltigen Typdefinitionen bei uns stehen, dann kommen die gleichen Fehlermeldungen, abgesehen von den Problemen bei der Deklaration der Komponenten auf dem Formular... Zitieren
lpd Geschrieben 8. April 2002 Geschrieben 8. April 2002 Ich nehme an, dass du das "TEFeld"-Set zwischen uses-Klausel und der ersten Klasse deklariert hast. Das darfst du in diesem Fall nicht machen. Diese Deklaration gehört ganz nach unten, zwischem dem "end" der Klasse und der Form-Variablen. type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; private { Private-Deklarationen } public procedure Test; { Public-Deklarationen } end; TEFeld = (TEdit, TButton, TLabel); var Form1: TForm1; Zitieren
Uruz Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 hmmmmmmmmmmm... ich danke dir... werd ich direkt testen, wenn ich wieder in der Firma bin... aehm, waere dann uebermorgen... weil morgen zuerst mal wieder Berufsschule... danke jedenfalls Andi Zitieren
MarcG Geschrieben 8. April 2002 Geschrieben 8. April 2002 Das sagt die Hilfe zu Set of: Eine Menge setzt sich aus mehreren Werten desselben ordinalen Typs zusammen Ich habe noch nie gesehen, das man Typen in Mengen zusammenfassen kann bzw über X in Y abfragen kann, was natürlich nichts zu heissen hat, man lernt ja nie aus. Was genau gefällt deinem Chef denn nicht ? vielleicht diese Konstruktion ... If ( Components[ilvLoop] Is TEdit ) or ( Components[ilvLoop] Is TCheckBox ) or ( Components[ilvLoop] Is TRadioGroup ) or ( Components[ilvLoop] Is TDBLookupComboBox ) ? Oder vielleicht das ganze Suchen über alle Komponenten ? Ich kenn es nicht anders zu überprüfen ob eine Komponenten einen bestimmten Typ hat. Was für eine Fehlerprüfung machst du denn und warum ? Wieviele Komponenten dieser Typen hast du denn überhaupt auf dem Formular? Zitieren
Uruz Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 nu ja... also... ich arbeite inzwischen in der oeffentlichen Verwaltung... heisst... es koennen bis zu 40 oder gar 60 Eingabefelder (sei es nu Combo, Edit, RadioGroup oder Checkbox) auf einem Formular zu finden sein... da werden dann auch noch mehrere Buttons oder Grids drauf zu finden sein... und die Pruefung soll eben nur bei den genannten Feldern stattfinden... die Iteration ueber alle Komponenten findet er gut... allerdings gefaellt ihm aber die "mehrfach-" Bedingung nicht... heisst anstatt "if ... or ... or ... or ... then... " moechte er - wenn moeglich - eine einzelne Abfrage "if Component in [...] then" oder so aehnlich... ist das denn ueberhaupt so moeglich ? Andi Zitieren
MarcG Geschrieben 9. April 2002 Geschrieben 9. April 2002 Original geschrieben von Uruz die Iteration ueber alle Komponenten findet er gut... allerdings gefaellt ihm aber die "mehrfach-" Bedingung nicht... heisst anstatt "if ... or ... or ... or ... then... " moechte er - wenn moeglich - eine einzelne Abfrage "if Component in [...] then" oder so aehnlich... ist das denn ueberhaupt so moeglich ? Also es gefällt ihm so nicht und er hätte es gern anders aber wie weiss er auch nicht ? Das sind immer die besten ... Ich hab da mal was gesehen was vielleicht auch in so einem Fall funktionieren könnte, damals hab ich mir gedacht ... 'hm, schöne Sache, muss ich mir merken' und jetzt ... ich bin noch am grübeln :D Zitieren
MarcG Geschrieben 9. April 2002 Geschrieben 9. April 2002 also gut ... ich hab ne andere Möglichkeit gefunden, ob die aber soviel besser ist weiss ich nicht, sieht aber wohl ... naja ... komplizierter aus unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DBCtrls, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; CheckBox1: TCheckBox; RadioGroup1: TRadioGroup; DBLookupComboBox1: TDBLookupComboBox; Button1: TButton; Button2: TButton; Edit2: TEdit; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } MyArray: array[0..3] of TWinControl; Components, CompInArray: Integer; function CheckControl(AControl: TWinControl): Boolean; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormShow(Sender: TObject); begin MyArray[0] := TEdit.create(nil); MyArray[1] := TCheckBox.create(nil); MyArray[2] := TRadioGroup.create(nil); MyArray[3] := TDBLookUpComboBox.create(nil); Components := 0; CompInArray := 0; end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:= 0 to Form1.ControlCount -1 do begin Inc(Components); //if Form1.Controls is TEdit then //MyControl := (Components as TWinControl); if CheckControl(Form1.Controls as TWincontrol) then Inc(CompInArray); end; edit2.text := 'Components: '+IntToStr(components)+' ComInarray: '+InttoStr(CompInArray); end; function TForm1.CheckControl(AControl: TWinControl): Boolean; var i: Integer; begin Result := False; for i:= 0 to High(MyArray) do if AControl.ClassType = MyArray.ClassType then Result := True; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var i: Integer; begin for i:= 0 to High(MyArray) do begin MyArray.free; end; end; end. Es handelt sich um ein Formular mit einer TRadioGroup, einer TDBLookupComboBox, einer TCheckBox, 2 TEdits und 2 TButtons. Bei Klick auf Button1 geh ich alle Controls durch (nicht Components) und zähle eine Hilfsvariable hoch, nur um zu sehen wieviele Controls er findet, Jede Control wird überprüft und eine andere Zählvariable erhöht. Am Ende steht das zur Überprüfung in Edit2 ... Quick'n'dirty aber ich hoff es hilft dir ... :cool: Das das so unübersichtlich dargestellt wird (keine Einrückung etc. liegt nicht an mir ) Zitieren
lpd Geschrieben 9. April 2002 Geschrieben 9. April 2002 Original geschrieben von MarcG Das das so unübersichtlich dargestellt wird (keine Einrückung etc. liegt nicht an mir ) Setz´ es einfach in den Code-Tag, dann kannst du auch einrücken : Hallo Hallo Hallo Hallo Zitieren
MarcG Geschrieben 9. April 2002 Geschrieben 9. April 2002 Hm, ok Danke, kann es jetzt aber nicht mehr ändern ... Zitieren
Uruz Geschrieben 10. April 2002 Autor Geschrieben 10. April 2002 na endlich erfahr ich auch mal wie das geht !!! *gggggggggggggggg* hab schon ewig lang geraetselt, wie man das macht.. Zitieren
Uruz Geschrieben 10. April 2002 Autor Geschrieben 10. April 2002 Original geschrieben von lpd Ich nehme an, dass du das "TEFeld"-Set zwischen uses-Klausel und der ersten Klasse deklariert hast. Das darfst du in diesem Fall nicht machen. Diese Deklaration gehört ganz nach unten, zwischem dem "end" der Klasse und der Form-Variablen. jupp ich hatte es da... macht aber keinen Unterschied... er kommt mit dem Feld auch so nicht klar... hmmm... den Array werd ich auch beizeiten mal ausprobieren... mal schauen, ob das noch was wird... ;o) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.