Zum Inhalt springen

Frage zu Delphi


Uruz

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen


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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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*

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ... :D

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 :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

also gut ... ich hab ne andere Möglichkeit gefunden, ob die aber soviel besser ist weiss ich nicht, sieht aber wohl ... naja ... komplizierter aus :D

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 :D )

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...