AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zahlen überprüfen --> keine darf doppelt
Thema durchsuchen
Ansicht
Themen-Optionen

Zahlen überprüfen --> keine darf doppelt

Ein Thema von Christian18 · begonnen am 29. Jun 2007 · letzter Beitrag vom 2. Jul 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Zahlen überprüfen --> keine darf doppelt

  Alt 29. Jun 2007, 18:49
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]
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#12

Re: Zahlen überprüfen --> keine darf doppelt

  Alt 29. Jun 2007, 21:40
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
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Zahlen überprüfen --> keine darf doppelt

  Alt 29. Jun 2007, 22:41
Hm... ja, setzt aber voraus, dass man bei jedem Edit das event definiert...
Najo.

Viele Wege führ'n nach Rom
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#14

Re: Zahlen überprüfen --> keine darf doppelt

  Alt 30. Jun 2007, 12:59
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
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Zahlen überprüfen --> keine darf doppelt

  Alt 30. Jun 2007, 17:54
Ich sag doch gar nix dagegen, Hagen...
Da ich nicht vor der Aufgabe stand und nur einen Lösungsansatz zeigen wollt, hab ich nur nicht weiter gedacht als nötig war
  Mit Zitat antworten Zitat
oldmax

Registriert seit: 27. Apr 2006
Ort: Gieboldehausen
167 Beiträge
 
#16

Re: Zahlen überprüfen --> keine darf doppelt

  Alt 2. Jul 2007, 06:47
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
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: Zahlen überprüfen --> keine darf doppelt

  Alt 2. Jul 2007, 07:30
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
Heiko
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#18

Re: Zahlen überprüfen --> keine darf doppelt

  Alt 2. Jul 2007, 10:13
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz