Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Frage zu Delphi

Empfohlene Antworten

Veröffentlicht

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

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

aloha... wollt auf den tag verzichten... der wird hier schon fuer andere sachen verwendet ;o)

daher muss ich eine andere moeglichkeit finden..

Uruz


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.

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*

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

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;

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

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?

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

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

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 )

Original geschrieben von MarcG

Das das so unübersichtlich dargestellt wird (keine Einrückung etc. liegt nicht an mir :D )

Setz´ es einfach in den Code-Tag, dann kannst du auch einrücken :


Hallo

  Hallo

    Hallo

Hallo

Hm, ok Danke, kann es jetzt aber nicht mehr ändern ...

;)

na endlich erfahr ich auch mal wie das geht !!!

*gggggggggggggggg*

hab schon ewig lang geraetselt, wie man das macht..

;)

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)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.