Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zahlen überprüfen --> keine darf doppelt (https://www.delphipraxis.net/95008-zahlen-ueberpruefen-keine-darf-doppelt.html)

cruiser 29. Jun 2007 17:49

Re: Zahlen überprüfen --> keine darf doppelt
 
Mal mein Ansatz als Code:

Delphi-Quellcode:
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;
Es geht die Edits unter einem Control durch, zählt TEdit-Ableger, und prüft gegen ein dynamisches Bool-Array.

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:
var
  we: Tedit;
begin
  if CheckDuplicates(Panel1, we) then
  begin
    // mach etwas mit we
  end;
end;
Ein netter Nebeneffekt ist, dass es Zahlen, die grösser als die Anzahl der Edits sind ebenfalls als Doppelte angezeigt werden...

[edit] noch ein bissel Entbugged ;) [/edit]

negaH 29. Jun 2007 20:40

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:
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;
Gruß Hagen

cruiser 29. Jun 2007 21:41

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:

negaH 30. Jun 2007 11:59

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

cruiser 30. Jun 2007 16:54

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:

oldmax 2. Jul 2007 05:47

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:

Das was mich "wurmt" ist eher der Punkt das Vorschläge kamen die eher sehr unelegant sind, zb. mit Strings zu rechnen statt gezielt eigene Datentypen zu benutzen !
Wo bitteschön wird denn mit Strings gerechnet. Um ein Ergebnis eines Editfeldes zu prüfen, muß ich nicht immer eigene Datentypen erfinden... und bis ein Anfänger das Verständnis dafür hat, sind Hilfen über das gesamte Delphispektrum erlaubt. Ein fortgeschrittener Programmierer wird hier nicht wegen eines so banalen Problemes um Hilfe bitten. Was hilft es dem Fragesteller zu erklären "du mußt eigene Datentypen definieren und in einer Klasse sich selbst überlassen" oder so...
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

hoika 2. Jul 2007 06:30

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:
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;
Heiko

Sidorion 2. Jul 2007 09:13

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.
Seite 2 von 2     12   

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