![]() |
In 2 Stringgrids Reihen vergleichen
Hallo
wie kann ich zwei unterschiedliche Stringgrids miteinander vergleichen. Das Beispiel unten funktioniert gut mit zwei identischen Stringgrids.
Delphi-Quellcode:
Mein Problem ist das in Stringgrid2 nur eine bestimmte Auswahl von Stringgrid1 steht.
var Row,Col:integer;
begin //Zelle ermitteln Stringgrid2.MouseToCell(X,Y,Col,Row); //Selektieren Form1.Stringgrid1.Row := Row; Form1.Stringgrid1.Col := Col; //Vergleichen if Form1.Stringgrid1.Cells[Col,Row] = Stringgrid2.Cells[Col,Row] then ShowMessage('Gleich') else ShowMessage('Nicht gleich'); end; Wenn ich in Stringgrid2 eine Zeile anklicke, so wird diese nicht an der gleichen Position Stringgrid1 markiert. capo |
Re: In 2 Stringgrids Reihen vergleichen
Damit klappt es fast
Es wird nur eine bestimmte Zelle (3) durchsucht. Wie kann ich die gesamte Reihe vergleichen?
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
const ZuDurchsuchendeSpalte = 3; var i: integer; ZuSuchenderString: string; begin ZuSuchenderString:= StringGrid2.Cells[ZuDurchsuchendeSpalte, StringGrid2.Row]; for i:= 0 to Form1.stringGrid1.RowCount-1 do begin If Form1.stringGrid1.Cells[ZuDurchsuchendeSpalte, i] = ZuSuchenderString then begin Form1.stringGrid1.Row:= i; break; end; end; end; |
Re: In 2 unterschiedlichen Stringgrids Zeilen vergleichen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
du kannst die ganze Reihe vergleichen, wenn du Rows[].CommaText an Stelle von Cells[] verwendest. Aber ich fände es viel besser, wenn du dir einfach merkst, woher die jeweilige Zeile kommt. Grüße vom marabu |
Re: In 2 Stringgrids Reihen vergleichen
Hallo Marabu
ich hab bestimmt noch etwas vín Uses einzutragen: Zitat:
Delphi-Quellcode:
Gruss Capo
{$I Func.RandomStr.pas}
|
Re: In 2 Stringgrids Reihen vergleichen
Sorry, passiert mir immer wieder:
![]() |
Re: In 2 Stringgrids Reihen vergleichen
Dankeschön für dein schönes Beispiel.
In deinem Beispiel klicke ich ja in das erste Stringgrid um das zweite zu füllen. Also momentan mache ich das so ...ich suche in Stringgrid1 einen Begriff und in Stringgrid2 werden mir alle Ergebnisse angezeigt. Da ich die angezeigten Zeilen aus Stringgrid2 auch bearbeiten möchte muss ich ja den Eintrag im ersten Stringgrid bearbeiten. Deshalb dieser Weg zurück zum ersten. Nur mit deinem Besipiel klappt das nicht, deine Idee ist natürlich super. Gruss Capo |
Re: In 2 Stringgrids Reihen vergleichen
So suche ich im ersten Stringgrid
Delphi-Quellcode:
procedure ClearGrid(sg: TSTringGrid);
var iCol: Integer; begin with sg do begin RowCount := Succ(FixedRows); for iCol := FixedCols to Pred(ColCount) do Cells[iCol, FixedRows] := ''; Tag := 0; // internal rowcount end; end; procedure AppendRow(sg: TStringGrid; s: TStrings); begin with sg do begin if Tag > 0 then RowCount := RowCount + 1; Rows[Pred(RowCount)].Assign(s); Tag := Succ(Tag); // internal rowcount // if RowCount=0 then exit end; end; procedure CopyRowsContaining(sg, sgResult: TStringGrid; search: string); var i: Integer; begin ClearGrid(sgResult); with sg do for i := FixedRows to Pred(RowCount) do if AnsiContainsText(Rows[i].Text, search) then AppendRow(sgResult, Rows[i]); end;
Delphi-Quellcode:
var
s: string; begin s := ''; s := findtext.Text; if s <> '' then begin CopyRowsContaining(StringGrid1, StringGrid2, s); |
Re: In 2 Stringgrids Reihen vergleichen
Hallo,
wenn ich dich richtig verstanden habe, dann möchtest du beim Klicken auf eine Zeile in StringGrid2, dass die entsprechende Zeile in StringGrid1 markiert wird. Eine kleine Änderung an AppendRow() und du kannst es so wie in meiner Demo machen:
Delphi-Quellcode:
Freundliche Grüße
function AppendRow(sg: TStringGrid; r: TStrings): TStrings;
begin with sg do begin RowCount := Succ(Tag); Result := Rows[Tag]; Result.Assign(r); Tag := RowCount; end; end; procedure CopyRowsContaining(sg, sgResult: TStringGrid; search: string); var i: Integer; begin ClearGrid(sgResult); with sg do for i := FixedRows to Pred(RowCount) do if AnsiContainsText(Rows[i].Text, search) then AppendRow(sgResult, Rows[i]).Objects[0] := Pointer(i); end; |
Re: In 2 Stringgrids Reihen vergleichen
Hallo Marabu
erhalte dann einen Fehler beim suchen. Zitat:
Bleibt hier in der IDE stehen:
Delphi-Quellcode:
if IsBaseCell then
Delphi-Quellcode:
Siehst du da einen Zusammenhang?
function TCellProperties.GetBaseCell(c, r: Integer): TPoint;
begin if IsBaseCell then Result := Point(c,r) else begin if (CellSpanX <> - 1) and (CellSpanY <> - 1) then Result := Point(c - CellSpanX,r - CellSpanY) else Result := Point(c,r) end; end; capo |
Re: In 2 Stringgrids Reihen vergleichen
Nicht direkt,
ist denn das AdvStringGrid von TMS voll kompatibel zum VCL-StringGrid? Nachdenkliche Grüße |
Re: In 2 Stringgrids Reihen vergleichen
Habe eine Email an TMS geschickt, folgendes kam zurück:
You would have to slightly modify the code in this particular case:
Delphi-Quellcode:
Habe ich gemacht aber irgendwie erhalte ich die gleiche Fehlermeldung:
begin
AppendRow(sgResult, Rows[i]); sgRegult.Objects[0,sgResult.RowCount - 1] := Pointer(i); end;
Delphi-Quellcode:
procedure CopyRowsContaining(sg, sgResult: TStringGrid; search: string);
var i: Integer; begin ClearGrid(sgResult); with sg do for i := FixedRows to Pred(RowCount) do if AnsiContainsText(Rows[i].Text, search) then begin // AppendRow(sgResult, Rows[i]).Objects[0] := Pointer(i); AppendRow(sgResult, Rows[i]); sgResult.Objects[0, sgResult.RowCount - 1] := Pointer(i); end; end; |
Re: In 2 Stringgrids Reihen vergleichen
Überzeugt bin ich nicht von diesem Lösungsvorschlag - um so weniger, als er deinen Fehler nicht beseitigt. Du hattest als Fehlerumgebung Code gezeigt, der außerhalb deines eigenen Programmcodes liegt - vielleicht in einer TMS Unit? Kannst du die Zeile in deinem eigenen Code identifizieren, in welcher der Fehler auftritt?
|
Re: In 2 Stringgrids Reihen vergleichen
ich kann folgende Zeile ausmachen, danach gibts den Fehler.
sgResult.Objects[0, sgResult.RowCount - 1] := Pointer(i); |
Re: In 2 Stringgrids Reihen vergleichen
Hallo kannst du nochmal gucken?
gruss capo |
Re: In 2 Stringgrids Reihen vergleichen
Hallo,
wenn der Fehler an dieser Stelle produziert wird, dann befürchte ich das Schlimmste. Warum hat der Support-Mitarbeiter von TMS die Adressierung von Objects[] von ein- auf zweidimensional umgestellt? Der Code müsste bei Kompatibilität doch identische Ergebnisse bringen. Entweder gibt es da Kompatibilitätsprobleme (was ich nicht glauben möchte) oder er hat aus Ratlosigkeit so gehandelt um seinen score nicht zu verderben. Verschaffe dir über einen Clean-Room-Test selbst Klarheit. Lege dazu ein Testprojekt mit einem AdvancedStringGrid (oder was du da verwendest) an und exerziere dort das Hinzufügen eines Pointers an Objects[], mal ein-, mal zweidimensional - in Abwesenheit deines sonstigen Codes. Wenn das im Testprojekt funktioniert, dann liegt der Fehler an diesem sonstigen Code. Freundliche Grüße |
Re: In 2 Stringgrids Reihen vergleichen
Danke für deinen Tip, ich vergesse sowas immer wieder. :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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