Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Inhalt von 2 Stringgrids Synchronisieren (https://www.delphipraxis.net/135266-inhalt-von-2-stringgrids-synchronisieren.html)

5etH 8. Jun 2009 07:58


Inhalt von 2 Stringgrids Synchronisieren
 
Hallo Zusammen,

momenten beiße ich mir echt die Zähne aus an der Synchro von 2 Stringgrids.

Momentan arbeite ich mit einer einfachen DB die es einmal local und einmal portabel gibt.
Diese beiden würde ich gerne synchronisieren jedoch stoße ich auf etliche Problem, wenn ich einen Fehler behebe tauchen 5 neue auf und ich weiß jetzt auch echt nicht mehr was ich noch machen soll.

Es sollen alle Einträge zusammengefügt werden, sprich eine Combi aus beiden ohne doppelte Einträge.

Meine Frage:
Ist das generell einfach zu realisieren und Denke ich einfach nur zu kompliziert?
Hat jemand sowas schon geschrieben das ich benutzen dürfte?
Wie gehe ich die Problematik am einfachsten an.


Mein eher schlechter Code:

Delphi-Quellcode:

loadgrid(Stringgrid4,Extractfilepath(paramstr(0))+'\DATA.SUX');//Locale DB


for X := 0 to Stringgrid2.rowCount - 1 do
begin
da := False;
  for Y := 0 to Stringgrid4.rowCount - 1 do//Locale DB
  begin
    if Stringgrid2.Cells[0,X] = Stringgrid4.Cells[0,Y] then // Portable DB
      begin
        da := true;
      end;
  end;
  if not da then
  begin
    stringgrid4.Rowcount:=stringgrid4.RowCount +1;
    for z := 0 to 3 do
      begin
        stringgrid4.Cells[Z,Stringgrid2.rowcount] := stringgrid2.Cells[Z,X];
      end;
  end;


  end;
Ich weis das das kein Glanzstück ist :pale:

trotzdem hoffe ich das ihr mir weiterhelfen könnt
Grüße
Manuel

Satty67 8. Jun 2009 08:20

Re: Inhalt von 2 Stringgrids Synchronisieren
 
Wie groß sind die StringGrid's (also wieviel Zeilen) und ist die Sortierung irgendwie von Bedeutung?

Im Prinzip schon so, das man StringGrid_A mit Zeilen aus StringGrid_B füllt sofern die nicht da sind. Am Ende kopiert man A 1:1 nach B.

Sind die StringGrid's groß, dann lohnt sich ein Array of TStringList als Püffer für die Zeilen.

5etH 8. Jun 2009 08:28

Re: Inhalt von 2 Stringgrids Synchronisieren
 
ich denke mal nicht das die Records über 300 gehen aber trotzdem funzt das nicht und ich hab ka wo mein fehler ist :?:

Satty67 8. Jun 2009 09:00

Re: Inhalt von 2 Stringgrids Synchronisieren
 
300 Zeilen ist wenig, selbst 1000 sind noch wenig. StringGrids werden so ab 10.000 ziemlich verschwenderisch.

Also ich würde die Aufgaben erst mal aufsplitten, StringGrid Reihen sind normale TStrings.

1) Funktion zum Vergleichen von TStrings (evtl ginge sogar ein Vergleich von DelimitedText)
2) Schleife die ungleiche TStrings in einem Grid oder Array sammeln
3) Das Grid (oder Array), das gesammelt hat in das andere kopieren


1)
Delphi-Quellcode:
function StrListEqual(StringsA, StringsB : TStrings):Boolean;
var
  i, Count : Integer;
begin
  Result := False;
  Count := StringsA.Count;
  if Count = StringsB.Count then
  begin
    i := 0;
    while i < Count do
      if StringsA[i] <> StringsB[i] then Exit;
    Result := True;
  end;
end;
3)
Delphi-Quellcode:
procedure CopyStringGrid(FromGrid, ToGrid : TStringGrid);
var
  i, Count : Integer;
begin
  Count := FromGrid.RowCount;
  ToGrid.RowCount := Count;
  for i := 0 to Count-1 do
    ToGrid.Rows[i].Assign(FromGrid.Rows[i]);
end;
Fehlt noch die Aufgabe 2)

StringGrid B zeilenweise mit A Vergleichen und bei Bedarf an A anhängen. Danach A -> B kopieren. Der Vergleich kann noch mit UpperCase CaseInsensiv gestaltet werden. bei neueren Delphi-Versionen kann auch DelimitedText mit CompareStr verglichen werden.

Lannes 8. Jun 2009 09:58

Re: Inhalt von 2 Stringgrids Synchronisieren
 
Hallo,

Row[x].Text kann man auch direkt vergleichen.

Hier mal mein Ansatz, als Inline-Prozedur, da A mit B und B mit A verglichen werden muss.

Delphi-Quellcode:
procedure SynchronisiereGrids(SG1,SG2: TStringGrid);

  //**** inline *******
  {} procedure Synchronisiere(SGSource, SGDest: TStringGrid);
  {} var z,zz : Integer;
  {} begin
  {}   for z := 0 to SGSource.RowCount-1 do
  {}     for zz := 0 to SGDest.RowCount-1 do
  {}       begin
  {}       if SGSource.Rows[z].Text = SGDest.Rows[zz].Text then
  {}         break;
  {}       if zz = SGDest.RowCount-1 then //nicht gefunden
  {}         begin
  {}         SGDest.RowCount := SGDest.RowCount + 1;
  {}         SGDest.Rows[SGDest.RowCount-1].Assign(SGSource.Rows[z]);
  {}         end;
  {}       end;
  {} end;
  //***** Ende inline ******

begin
  Synchronisiere(SG1,SG2);
  Synchronisiere(SG2,SG1);
end;
Der Aufruf
Delphi-Quellcode:
 SynchronisiereGrids(StringGrid_A,StringGrid_B);
//Edit: nicht benutzte Variable c gelöscht

Satty67 8. Jun 2009 10:25

Re: Inhalt von 2 Stringgrids Synchronisieren
 
Das ich TStrings.Text vergessen hab', heißt jetzt ich, das ich mir wegen meines Alters schon langsam Sorgen machen muss?

@Lannes: Sieht natürlich besser aus... könnte höchstens noch mit weniger Schleifendurchläufen punkten.


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