Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Doppelten String nicht übergeben (https://www.delphipraxis.net/93773-doppelten-string-nicht-uebergeben.html)

SaFu 11. Jun 2007 09:16


Doppelten String nicht übergeben
 
Hallo zusammen

ich gebe von den Zellen 11 und 12 eines StringGrids den inhalt an ein Eidt feld jetzt möcht ich aber die doppelten Einträge nicht übergeben wie mache ich das

Delphi-Quellcode:
procedure TForm7.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
var spalte, ueberschri :Integer;
begin
  with TStringList.Create do
  try

    for spalte:= 11 to 12 do
    begin                                      
      ueberschri:= Count;
      StringGrid1.Cols[Spalte]:= DupIgnore;// so geht es nicht
      AddStrings(StringGrid1.Cols[spalte]);
      Delete(ueberschri);
    end;

    Edit1.Text:= StringReplace(Text, sLineBreak, '', [rfReplaceAll]);
  finally
    Free;
  end;
Danke schonmal

DeddyH 11. Jun 2007 09:19

Re: Doppelten String nicht übergeben
 
Delphi-Quellcode:
with TStringList.Create do
  try
    Duplicates := dupIgnore;
Oder versteh ich Dich falsch?

SaFu 11. Jun 2007 09:25

Re: Doppelten String nicht übergeben
 
So funzt es auch nicht

wenn ich in der spalte [11,1] z.b. Hallo eingebe und ich gebe in der spalte [11.2] auch Hallo ein soll es nicht an edit1 übergeben werden

mquadrat 11. Jun 2007 09:26

Re: Doppelten String nicht übergeben
 
Ahh du möchtest, dass Hallo dann überhaupt nicht drin auftaucht?

SaFu 11. Jun 2007 09:28

Re: Doppelten String nicht übergeben
 
Genao so

Wenn ich zweimal eingegeben habe soll es nur einmal im Edit feld drinstehen genauso bei dreimal usw.

Irgenwas mit Duplicates := dupIgnore; ??

SirThornberry 11. Jun 2007 09:31

Re: Doppelten String nicht übergeben
 
dann funktionierts auch mit dubIgnore. dann ist lediglich deine verwendung falsch. Mit dubIgnore erreichst du das in eine Stringlist nur etwas hinzugefügt werden kann wenn es noch nicht drin ist.

SaFu 11. Jun 2007 09:37

Re: Doppelten String nicht übergeben
 
Dafür brauch ich doch diese Variable

Delphi-Quellcode:
(StringGrid1.Cols[spalte])
um die ganzen zellen zu übergeben

SaFu 11. Jun 2007 09:49

Re: Doppelten String nicht übergeben
 
Hab jetzt mal viele Variationen versucht aber irgendwie klappt das nicht

Klaus01 11. Jun 2007 10:33

Re: Doppelten String nicht übergeben
 
Hilft vielleicht nicht bei der Problemlösung, aber
dupIgnore funktioniert nur wenn bei der StringList sorted auf true gesetzt wird.

Grüße
Klaus

SaFu 11. Jun 2007 17:29

Re: Doppelten String nicht übergeben
 
Das heisst ich müsste erst ne neue Stringlist erzeugen??

Klaus01 11. Jun 2007 17:50

Re: Doppelten String nicht übergeben
 
Nun, wenn Du die Stringlist sortierst ändert sich auch die Reihenfolge
in der die Strings in der Liste angeordnet sind.

Ich weiß nicht ob Du das willst?

Wenn Du nur zwei Spalten auf Einträge überprüfen willst die schon vorhanden sind, warum
gehst Du dann nicht Zeile für Zeile die Spalten durch und schaust nach ob
ein Eintrag mit dem Eintrag Deines Editfeldes übereinstimmt.

Delphi-Quellcode:
for i:=0 to StringGrid1.rowCount -1 do
  begin
    if StringGrid1.Cells[11,i] <> Edit1.text then
      // füge hinzu
   else
     // mache nichts
  end;
Grüße
Klaus

SaFu 11. Jun 2007 17:51

Re: Doppelten String nicht übergeben
 
Das ist eigentlich egal es wre sogar besser wenn es sotiert wäre

Klaus01 11. Jun 2007 17:59

Re: Doppelten String nicht übergeben
 
Hallo Sascha,

das sollte in etwas so gehen:

Delphi-Quellcode:
var
  sl: TStringList;

begin
  sl := TStringList.create;
  sl.sorted := true;                // Liste sortieren Modus
  sl.duplicated := dupIgnore;       // keine doppelten Einträge
  sl.assign(StringGrid1.cols[11]);  //  zuweisen der Spalte 11 in die StringListe
  sl.add(edit1.text);               // hinzufügen des neuen Textes, wenn doppelt wird er nicht hinzugefügt
  StringGrid1.cols[11].assign(sl);  // zuweisen der StringListe in die Spalte 11
  sl.free;                          // freigeben der StringListe
end;
Habe es nicht getestet.
Grüße
Klaus

SaFu 11. Jun 2007 18:11

Re: Doppelten String nicht übergeben
 
Naja funktioniert nicht ganz

CCRDude 11. Jun 2007 18:13

Re: Doppelten String nicht übergeben
 
Dann musst Du "was" tun, damit es klappt.

...

Sorry, ist genauso ne Antwort wie die Aussage "funktioniert nicht ganz" ;)

Ich denke, das zuweisen per Add(andereliste.Text) kann auch bzgl. dupIgnore nicht funktionieren, wenn müssten alle getrennt zugewiesen werden (for i := ... to Count do Add(liste[i])...).

SaFu 11. Jun 2007 18:36

Re: Doppelten String nicht übergeben
 
Verstehe deinen satz nicht genau meinst du die Spalten von das vom Klaus war doch schon ganz gut oder verstehe ich da was nicht

Klaus01 11. Jun 2007 20:07

Re: Doppelten String nicht übergeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe mal mit dem StringGrid ein wenig rumespielt und festgestellt,
daß das OnSetEditText Ereignis zu jedem Tastendruck abgefeuert wird der im EditModus
in einer Zelle getätigt wird. Und das ist denkbar ungünstig zu nutzen um zu überprüfen
ob eine Text/String schon in der Spalte vorhanden ist.

Ist es in Deinem Programm nicht möglich, die Dateneingabe getrennt vom StringGrid zu machen?
Das würde die Suche nach Duplikaten erheblich vereinfachen.

Ich hätte mir das so vorgestellt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:Byte;
  gefunden:Boolean;
begin
  gefunden:=false;
  for i:=0 to StringGrid1.RowCount -1 do
    if StringGrid1.Cells[1,i] = edit1.Text then
      begin
        gefunden:=true;
      end;
  if not gefunden then
    begin
      StringGrid1.RowCount := StringGrid1.RowCount +1;
      StringGrid1.Cells[1,StringGrid1.RowCount -2]:=Edit1.Text;
    end;

end;
Grüße
Klaus

SaFu 11. Jun 2007 21:26

Re: Doppelten String nicht übergeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
So ab mal die funktion vom StringGrid angehäng

Wenn mann in der spalte 11 und 12 was eingibt werden diese ans Edit weiter gegeben und vom Edit ans label

Was ich jetzt gerne machen würde ist das im label keine doppelten einträge stehen ob die jetzt vom Editfeld oder vom Stringgrid gefiltert werden ist eigentlich egal

komm einfach nicht weiter

Hoffe es hilft weiter quelltext ist auch dabei

Klaus01 12. Jun 2007 06:43

Re: Doppelten String nicht übergeben
 
Zitat:

Zitat von fuknersascha
...
Wenn mann in der spalte 11 und 12 was eingibt werden diese ans Edit weiter gegeben und vom Edit ans label

Was ich jetzt gerne machen würde ist das im label keine doppelten einträge stehen ob die jetzt vom Editfeld oder vom Stringgrid gefiltert werden ist eigentlich egal

Guten Morgen Sascha,

habe mir Deinen Quelltext noch nicht angeschaut,
aber wenn das Label alle die Informationen hat welche schon eingegeben wurden,
dann kannst Du das auch nur anhand des Labels überprüfen ob die gleichen Daten schon vorhanden sind.

Ich würde das machen wenn die Eingabe vom Edit in das Label geht.
Hier kannst Du z.B. mit pos überprüfen, ob der Edit Inhalt im Label schon vorhanden ist.

Delphi-Quellcode:
if (pos(Edit1.Text,label1.caption) > 0 then
  // Eintrag vorhanden
else
  // Eintrag nicht vorhanden
Grüße
Klaus

SaFu 12. Jun 2007 09:53

Re: Doppelten String nicht übergeben
 
funktioniert leider auch nicht

Kann es sein das es nicht funktioniert weil der eingegebene text als ganzer string eingelesen wird und deshalb nicht geprüft wird ?

in den letzten zwei spalten im StringGrid werden nur abkürzungen max 2 buchstaben eigegeben und dann muss noch ein komma gesetzt werden das es besser zu lessen ist im Label das ist die einzige trennung de gesetzt werden muss

Klaus01 12. Jun 2007 10:11

Re: Doppelten String nicht übergeben
 
Zitat:

type
TSetEditEvent = procedure (Sender: TObject; ACol, ARow: Longint; const Value: WideString) of object;
property OnSetEditText: TSetEditEvent;

Description

Write an OnSetEditText event handler to perform any special processing of the text edited by the user in an in-place editor. For example, use the OnSetEditText event to retrieve and store the value of a cell so that it can be displayed in an OnDrawCell event handler. OnSetEditText occurs every time the user changes the text.
Verabschiede Dich einmal von dem SetEditText Event, das wird jedesmal ausgelöst wenn der Text in der Zelle
geändert wird. Dein Zellentext wird also Zeichenweise in das Editfeld und auch das Label übertragen.
Damit wird eine Überprüfung die auf Wortbasis basiert unmöglich.

Entweder Du suchst Dir ein event das ausgelöst wird, wenn Du mit dem Editieren fertig bist - da habe ich noch keines gefunden - oder eines wenn Du die Zelle verlässt - habe ich auch noch keines gefunden - oder
Du machst noch einen Button auf die Form (mit Namen überprüfen/übernehmen o.ä) wo Du dann die Zellinhalte
überprüfen und gegebenenfalls anmeckern kannst.

Hier bin ich mit meinem Latein am Ende.

Grüße
Klaus

marabu 12. Jun 2007 10:18

Re: Doppelten String nicht übergeben
 
Hallo Sascha,

wenn die Anzeige unbedingt permament aktualisiert werden soll, dann so:

Delphi-Quellcode:
function ColsToStr(sg: TStringGrid; colNums: array of Integer): string;
var
  iCol, iRow: Integer;
  s: string;
begin
  with TStringList.Create do
  try
    Sorted := True;
    for iCol := Low(colNums) to High(colNums) do
      for iRow := sg.FixedRows to Pred(sg.RowCount) do
      begin
        s := Trim(sg.Cols[colNums[iCol]][iRow]);
        if (s <> '') and (IndexOf(s) < 0) then
          Add(s);
      end;
    Result := CommaText;
  finally
    Free;
  end;
end;

procedure TForm1.StringGridSetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
  Edit1.Text := ColsToStr(StringGrid, [11, 12]);
end;
Freundliche Grüße

SaFu 12. Jun 2007 10:28

Re: Doppelten String nicht übergeben
 
Genau das wars

Dank dir und natürlich auch ein danke an klaus für seine mühen konnte auch die sachen vom klaus für was anderes benutzen hab.

danke euch beiden


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 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