![]() |
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:
Ich weis das das kein Glanzstück ist :pale: 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; trotzdem hoffe ich das ihr mir weiterhelfen könnt Grüße Manuel |
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. |
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 :?:
|
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:
3)
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;
Delphi-Quellcode:
Fehlt noch die Aufgabe 2)
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; 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. |
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:
Der Aufruf
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;
Delphi-Quellcode:
//Edit: nicht benutzte Variable c gelöscht
SynchronisiereGrids(StringGrid_A,StringGrid_B);
|
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