Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi In 2 Stringgrids Reihen vergleichen (https://www.delphipraxis.net/85443-2-stringgrids-reihen-vergleichen.html)

capo 30. Jan 2007 21:56


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:
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;
Mein Problem ist das in Stringgrid2 nur eine bestimmte Auswahl von Stringgrid1 steht.
Wenn ich in Stringgrid2 eine Zeile anklicke, so wird diese nicht an der gleichen Position Stringgrid1 markiert.

capo

capo 30. Jan 2007 23:09

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;

marabu 31. Jan 2007 07:12

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

capo 31. Jan 2007 07:29

Re: In 2 Stringgrids Reihen vergleichen
 
Hallo Marabu
ich hab bestimmt noch etwas vín Uses einzutragen:
Zitat:

[Fehler] DemoFrm.pas(36): Undefinierter Bezeichner: 'RandomStr'
bei
Delphi-Quellcode:
{$I Func.RandomStr.pas}
Gruss Capo

marabu 31. Jan 2007 07:43

Re: In 2 Stringgrids Reihen vergleichen
 
Sorry, passiert mir immer wieder: klick

capo 31. Jan 2007 09:05

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

capo 31. Jan 2007 09:25

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);

marabu 31. Jan 2007 09:42

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:
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;
Freundliche Grüße

capo 31. Jan 2007 12:57

Re: In 2 Stringgrids Reihen vergleichen
 
Hallo Marabu

erhalte dann einen Fehler beim suchen.

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 004BD5D8 in Modul 'Project1.exe'. Lesen von Adresse 0000004B'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
Evt. liegt es an der TMS Stringgrid Kompo.
Bleibt hier in der IDE stehen:
Delphi-Quellcode:
if IsBaseCell then
Delphi-Quellcode:
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;
Siehst du da einen Zusammenhang?

capo

marabu 31. Jan 2007 13:17

Re: In 2 Stringgrids Reihen vergleichen
 
Nicht direkt,

ist denn das AdvStringGrid von TMS voll kompatibel zum VCL-StringGrid?

Nachdenkliche Grüße

capo 31. Jan 2007 18:14

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:
begin
  AppendRow(sgResult, Rows[i]);
  sgRegult.Objects[0,sgResult.RowCount - 1] := Pointer(i);
end;
Habe ich gemacht aber irgendwie erhalte ich die gleiche Fehlermeldung:
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;

marabu 31. Jan 2007 18:36

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?

capo 31. Jan 2007 19:04

Re: In 2 Stringgrids Reihen vergleichen
 
ich kann folgende Zeile ausmachen, danach gibts den Fehler.
sgResult.Objects[0, sgResult.RowCount - 1] := Pointer(i);

capo 1. Feb 2007 18:00

Re: In 2 Stringgrids Reihen vergleichen
 
Hallo kannst du nochmal gucken?
gruss capo

marabu 1. Feb 2007 18:12

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

capo 1. Feb 2007 18:42

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