![]() |
Re: Zahlen überprüfen --> keine darf doppelt
Mal mein Ansatz als Code:
Delphi-Quellcode:
Es geht die Edits unter einem Control durch, zählt TEdit-Ableger, und prüft gegen ein dynamisches Bool-Array.
function CheckDuplicates(ParentControl: TWinControl; var WrongEdit: TEdit): Boolean;
var i,n: Integer; ba: array of Boolean; begin Result := False; n := 0; // Edits zaehlen for i := 0 to Pred(ParentControl.ControlCount) do if ParentControl.Controls[i].InheritsFrom(TEdit) then Inc(n); // Keine Edits? Dann Ende. if n = 0 then exit; // ByteArray setzen SetLength(ba, n); // Edits checken for i := 0 to Pred(ParentControl.ControlCount) do if ParentControl.Controls[i].InheritsFrom(TEdit) then begin // Zahl auslesen, wenn keine Zahl dann 0, wenn 0 dann ignorieren n := StrToIntDef((ParentControl.Controls[i] as TEdit).Text, 0) - 1; if n >= 0 then begin // Mit Array vergleichen If ba[n] then begin WrongEdit := (ParentControl.Controls[i] as TEdit); Result := True; Exit; end else ba[n] := true; end; end; end; Trifft es auf ein Edit mit einer Zahl, die schon existiert, bricht es ab und notiert dieses Edit in WrongEdit. So kann man dieses selektieren, markieren, etc. Aufgerufen wereden könnt es etwa so:
Delphi-Quellcode:
Ein netter Nebeneffekt ist, dass es Zahlen, die grösser als die Anzahl der Edits sind ebenfalls als Doppelte angezeigt werden...
var
we: Tedit; begin if CheckDuplicates(Panel1, we) then begin // mach etwas mit we end; end; [edit] noch ein bissel Entbugged ;) [/edit] |
Re: Zahlen überprüfen --> keine darf doppelt
Hi wenn du das schon so machst dann kannst du auch gleich auf Duplikat prüfen ohne dein Array[] of Boolean
Delphi-Quellcode:
Gruß Hagen
function CheckDuplicates(const Edit: TEdit): Boolean;
var I: Integer; Zahl: String; begin Result := False; if Edit is TEdit then begin Zahl := AnsiUpperCase(FullTrim(Edit.Text)); with Edit.Parent do for I := 0 to ControlCount -1 do if (Controls[I] <> Edit) and (Controls[I] is TEdit) and AnsiCompareText(FullTrim(TEdit(Controls[I]).Text)), Zahl) = 0 then Exit; Result := True; end; end; procedure TForm1.EditChange(Sender: TObject); // alle TEdit.OnChange verweisen auf diesen Eventhandler begin if CheckDuplicates(Sender as TEdit) then with Sender as TEdit do raise Exception.CreateFmt('Der Wert %s aus %s kommt schon vor', [Text, Name]); end; |
Re: Zahlen überprüfen --> keine darf doppelt
Hm... ja, setzt aber voraus, dass man bei jedem Edit das event definiert...
Najo. Viele Wege führ'n nach Rom :mrgreen: |
Re: Zahlen überprüfen --> keine darf doppelt
Und? alle TEdits auf dem Form per STRG+Maus Taste markieren, in OnChange im OI dann auf TForm1.EditCHange() setzen.
Geht man diesen Weg nicht so muß man denoch irgendeinen Zeitpunkt, bei dem sich der Inhalt eines der TEdits verändert, aussuchen und dann die Funktion CheckDuplicates() per Hand im Source aufrufen. Na, da bevorzuge ich doch die Events im OI auf einen gemeinsammen Eventhandler zu setzen, das kostet dann keinerlei extra Quelltext. Gruß Hagen |
Re: Zahlen überprüfen --> keine darf doppelt
Ich sag doch gar nix dagegen, Hagen... :angel2:
Da ich nicht vor der Aufgabe stand und nur einen Lösungsansatz zeigen wollt, hab ich nur nicht weiter gedacht als nötig war :oops: |
Re: Zahlen überprüfen --> keine darf doppelt
Hi
@ Hagen Nun, nicht das ich dir auf die Füße treten will, aber manchmal irrt auch ein Fachmann. Zitat: Zitat:
Sorry, für mich sind die Inhalte eines Editfeldes immer noch Strings und daher ist ein Vergleich mit Strings durchaus etwas, was dich nicht wurmen sollte. Andererseits, mir ist's letztlich egal, ob's dich wurmt Gruß oldmax |
Re: Zahlen überprüfen --> keine darf doppelt
Hallo,
so denke ich auch. Warum neues (Datentyp) erfinden, wenn für die Aufgabe auch TStringList geht. mit Duplicates:= [dupError] und try except um das Insert bekommt man ganz schnell Dopplungen raus. Zu den Edits: Ich würde hier noch Tag benutzen, um die Zahlen-Edits von viell. vorhandenen anderen Edits zu unterscheiden,also etwa so
Delphi-Quellcode:
Heiko
for i:= 0 to Components.Count do
begin if Components[i] is TEdit then begin Edit:= TEdit(Components); if Edit.Tag=1 then begin // hier kommt jetzt das "versuche einzufügen" // das Edit kann z.B. benutzt werden, // um per Edit.Focus den falschen Eintrag zu markieren end; end; end; |
Re: Zahlen überprüfen --> keine darf doppelt
Ne Stringliste wäre auch mein Vorschlag gewesen, da man sich hier zudam das Konvertieren nach Integer spart.
Damit das mit den Duplicates auch funktioniert nuss man allerdings die Stringliste auch sorted=true setzen. Wenn man kein exception-handlig machen will, kann man die Liste auch auf dupIgnore stellen. Dann merkt man sich einfach vor dem Einfügen die Anzahl, fügt ein und wenn sich die Anzahl nicht erhöht hat, gabs die Zahl schonmal. Diese Lösung ist nicht nur elegant, sondern auch effektiv, da die Stringliste eine Binärsuche verwendet, sobald sie sortiert ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz