Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stringgrid zu dem entsprechenen Anfangsbuchstaben springen (https://www.delphipraxis.net/80851-stringgrid-zu-dem-entsprechenen-anfangsbuchstaben-springen.html)

capo 16. Nov 2006 12:10


Stringgrid zu dem entsprechenen Anfangsbuchstaben springen
 
Hallo

habe in einem Stringgrid viele Namen diese sind auch sortiert.
Nun möchte ich im Stringgrid zu dem entsprechenen Anfangsbuchstaben springen wenn ich einen Buchstaben in ein Edit einfüge.

Wer mag mir zeigen wie das geht?

Gruss capo

Panthrax 16. Nov 2006 12:44

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Hallo.

Vielleicht habe ich ja etwas falsch verstanden, aber ich weiß so richtig nicht wo dein Problem liegt? Hier gibt's ein bisschen Quelltext, ich hoffe es ist, was du erfragt hast:
Delphi-Quellcode:
function IndexOfName(const Name: String; const Strings: TStrings; Lo: Integer = 0; Hi: Integer = -1): Integer;
var
  Middle: Integer;
begin
  if Hi = -1 then Hi:=Strings.Count-1;
  while (Lo < Hi) do
  begin
    Middle:=(Lo+Hi) div 2;
    if StrIComp(PChar(Strings[Middle]),PChar(Name)) > 0
      then Hi:=Middle
      else Lo:=Middle+1;
  end;
  Result:=Lo;
end;
Beispielaufrufe;
Delphi-Quellcode:
StringGrid1.Col:=1;
StringGrid1.Row:=IndexOfName(Edit1.Text,StringGrid1.Cols[1]);
// alternativ: StringGrid1.Row:=IndexOfName(Edit1.Text,StringGrid1.Cols[1],StringGrid1.FixedRows);
Soetwas schaffst du aber auch allein.
Zitat:

Zitat von capo
Wer mag mir zeigen wie das geht?

Irgendwie mag ich diesen Satz nicht. Ich neheme es so, als sei er nur falsch rübergekommen.

Gruß,
Panthrax.

capo 16. Nov 2006 12:51

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Hallo
Zitat:

Irgendwie mag ich diesen Satz nicht. Ich nehme es so, als sei er nur falsch rübergekommen.
das ist gut so, danke.
ganz so hilflos bin ich nun auch nicht :).
Dein Beispiel funktioniert supergut, danke !
gruss vom capo

capo 16. Nov 2006 13:14

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Hallo
ich hatte versucht die Zeile in der dieser Buchstabe zuerst gefunden wird auch gleich zu markieren mit:
Delphi-Quellcode:
StringGrid1.Row:=IndexOfName(Edit1.Text,StringGrid1.Cols[1],StringGrid1.SelectedRow[1]);
oder sowas
Delphi-Quellcode:
StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,
                                        1,
                                        StringGrid1.ColCount-1,
                                        1));
haut das aber nicht hin.

Das Beste wäre natürlich wenn das gesuchte (gefundene) immer ganz oben als ersten zu sehen wäre.

raiguen 16. Nov 2006 14:13

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Zitat:

Zitat von capo
Delphi-Quellcode:
StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,
                                        1,
                                        StringGrid1.ColCount-1,
                                        1));
haut das aber nicht hin.

Doch :wink: vom Prinzip her schon. Laut OH sollte dazu natürlich in den StringGrid-Options goRangeSelect auf true stehen...
Wenn du das nun so machst
Delphi-Quellcode:
....
gefundeneZeile :=IndexOfName(Edit1.Text,StringGrid1.Cols[1]);
...
StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,
                                        gefundeneZeile,
                                        StringGrid1.ColCount-1,
                                        gefundeneZeile));
StringGrid1.TopRow := gefundeneZeile;
wird die gefundeneZeile komplett markiert und gleichzeitig deinem Wunsche entsprechend als erste Zeile (nach der evtl. vorhandenen festen Zeile) 'verschoben' ;)

capo 16. Nov 2006 16:27

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Hallo und ;)

das funktioniert soweit fast 100%
merkwürdig ist nur das wenn ich nach S suche sofort nach W gesprungen wird und W
in der ersten reihe ganz oben steht.
[EDIT]
macht er ab dem buchstaben Q
so mach ich das nun.
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  StringGrid1.Col := 1;
  StringGrid1.Row := IndexOfName(Edit1.Text, StringGrid1.Cols[1]);
  StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,
    StringGrid1.Row,
    StringGrid1.ColCount - 1,
    StringGrid1.Row));
  StringGrid1.TopRow := StringGrid1.Row;
end;

marabu 16. Nov 2006 17:28

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Hallo,

hier noch ein anderer Ansatz: Wenn die Namen in ihrer Grid-Spalte bereits sortiert sind, dann kann man auf die Methode TStrings.Find zurückgreifen:

Delphi-Quellcode:
procedure LocateRow(sg: TStringGrid; iCol: Integer; const sText: String);
var
  iRow: Integer;
begin
  with TStringList.Create do
  try
    Assign(sg.Cols[iCol]);
    Sorted := True;
    for iRow := 1 to sg.FixedRows do
      Delete(0);
    Find(sText, iRow);
    iRow := iRow + sg.FixedRows;
    sg.Row := iRow - iRow div sg.RowCount; // restrict row index
    sg.Col := iCol;
  finally
    Free;
  end;
end;

const
  NAME_COL = 0;

procedure TDemoForm.EditChange(Sender: TObject);
begin
  with Sender as TEdit do
    LocateRow(StringGrid, NAME_COL, Text);
end;
Freundliche Grüße

capo 16. Nov 2006 18:25

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Hallo marabu
das funktioniert nun supergut.
muss mir das aber alees genau ansehen, noch versteh ich nicht ganz was da geschieht.
ich danke....!
gruss vom capo

capo 16. Nov 2006 18:54

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
z.b. möchte ich auch in einer anderen reihe suche
da muss ich doch hier
Delphi-Quellcode:
NAME_COL = 2;
angeben, merkwürdigerweise funktioniert das nicht.

marabu 16. Nov 2006 19:05

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Hi,

Zitat:

Zitat von marabu
Wenn die Namen in ihrer Grid-Spalte bereits sortiert sind, dann

wenn in der Spalte mit dem Index 2 die Vorbedingung erfüllt ist, dann sollte das auch dort funktionieren.

capo 16. Nov 2006 21:12

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Zitat:

Wenn die Namen in ihrer Grid-Spalte bereits sortiert sind, dann
die müßten anundfürsich sortiert sein,
ich verwende auch folgenden code, damit wird doch auch sortiert oder nicht? :) :oops:

Delphi-Quellcode:
procedure LocateRow_b(sg: TStringGrid; iCol: Integer; const sText: String);
var
  iRow: Integer;
begin
  with TStringList.Create do
  try
    Assign(sg.Cols[iCol]);
    Sorted := True;
    for iRow := 1 to sg.FixedRows do
      Delete(0);
    Find(sText, iRow);
    sg.Row := iRow + sg.FixedRows;
    sg.Col := iCol;
  finally
    Free;
  end;
end;
const
  NAME_COL_b = 2;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  with Sender as TEdit do
    LocateRow_b(StringGrid1, NAME_COL_b, Text);
  StringGrid1.TopRow := StringGrid1.Row;
end;
Bekomm auch bei dem Buchstaben Z folgende Fehlermeldung

Zitat:

Gitterindex außerhalb des zulässigen Bereichs.

capo 16. Nov 2006 22:46

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Das vorherige Problem hat sich erledigt.
Danke

marabu 17. Nov 2006 06:29

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Guten Morgen.

Damit sich das Problem auch für alle anderen erledigt hat, habe ich eine kleine Anpassung an meinem Code in Beitrag #7 gemacht.

Zitat:

Zitat von capo
... ich verwende auch folgenden code, damit wird doch auch sortiert oder nicht?

Vorsicht! Wenn ich Sorted auf True setze, dann nur um den binary search mode einzuschalten. Die Daten im Grid müssen trotzdem schon sortiert vorliegen.

Freundliche Grüße

capo 17. Nov 2006 10:04

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
hallo marabu
habs nun auch endlich mit dem sortieren verstanden
ich mach das so
Delphi-Quellcode:
  StringGrid1.SortSettings.Direction := sdAscending;
          StringGrid1.SortSettings.Column := 0;
          StringGrid1.QSort;
ich habe nun doch noch eine frage
bekomme wieder folgende meldung
Zitat:

Gitterindex außerhalb des zulässigen Bereichs.
das liegt wohl daran das kein Z in der liste vorhanden ist
läßt ich diese fehlermeldung abschalten?

hab hier zwei beispiele gefunden, mal abgesehen davon weiss ich nicht ob der fehler damit zu beheben ist:
Delphi-Quellcode:
if TopRow+Visiblerowcount<rowcount then toprow:=toprow+1;
Zitat:

fehlermeldung:
[Fehler] Unit1.pas(806): Undefinierter Bezeichner: 'Visiblerowcount'
[Fehler] Unit1.pas(806): Undefinierter Bezeichner: 'rowcount'

Delphi-Quellcode:
if StringGrid1.TopRow+Visiblerowcount<rowcount then StringGrid1.toprow:=StringGrid1.toprow+1;
Zitat:

fehlermeldung:
[Fehler] Unit1.pas(807): Undefinierter Bezeichner: 'fixedrows'
[Fehler] Unit1.pas(807): Undefinierter Bezeichner: 'toprow'
gruss vom capo

marabu 17. Nov 2006 12:42

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Der ausgebüchste Gitterindex sollte tatsächlich auf das nicht vorhandene Z zurück zu führen sein. Hast du meine Korrektur im Beitrag #7 übersehen? Damit sollte dieser Fehler nicht mehr auftreten.

Freundliche Grüße

capo 17. Nov 2006 14:00

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
Zitat:

Hast du meine Korrektur im Beitrag #7 übersehen?
hallo
nein hab ioch natürlich sofort ausprobiert, und auch damit hab ich den fehler.
steht das auch richtig im Edit1Change?
nun, ich probier hier mal weiter.
:-D capo

[EDIT]
doch nun funktioniert es
hab anstatt
Delphi-Quellcode:
procedure LocateRow_vorname(sg: TStringGrid; iCol: Integer; const sText: String);
var
  iRow: Integer;
begin
 ...
    for iRow := 1 to sg.FixedRows do
...
end;

das gemacht weil die reihe darüber immer noch mit angezeigt wird, also der curso springt im stringgrid immer eine zeile über das ergebnis,deshalb.

Delphi-Quellcode:
procedure LocateRow_vorname(sg: TStringGrid; iCol: Integer; const sText: String);
var
  iRow: Integer;
begin
 ...
    for iRow := 2 to sg.FixedRows do
...
end;
mal sehen vielleicht kann ich das auch anders erreichen.

capo 17. Nov 2006 22:28

Re: Stringgrid zu dem entsprechenen Anfangsbuchstaben spring
 
komisch wenn ich das
Sorted := True;
rausnehme, wird bei der suche nach A alles richtig angezeigt
Delphi-Quellcode:
  with TStringList.Create do
  try
    Assign(sg.Cols[iCol]);
  Sorted := True;
s. [Edit] im vorherigen beitrag


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