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 StringGrid-Zeilen mit einem Balken navigieren (https://www.delphipraxis.net/77770-stringgrid-zeilen-mit-einem-balken-navigieren.html)

LOMBI 24. Sep 2006 17:44


In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo,

ich benötige in einem StringGrid einen gelben Balken, mit dem ich eine
beliebige Zeile auswählen kann (zB.per Click od. mit Pfeiltasten).

Delphi-Quellcode:
procedure TFRechn.StringGridRedatDrawCell(Sender: TObject;
Col, Row: Integer; Rect: TRect; State: TGridDrawState);
var
  index: Integer;
begin
  index := Row * StringGridRedat.ColCount + Col;
  with Sender As TStringGrid do
  begin
    if gdSelected in State then
      Canvas.Brush.Color := clYellow;
      Canvas.Font.Color := clBlack;
end;
Leider funktioniert mein Code nicht. Die Titelzeile (Cell[0])soll nicht markiert werden. Wer hilft mir bitte?

Gruß
Lombi

mkinzler 24. Sep 2006 17:46

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Was funktioniert nicht? macht er garnichts oder das Falsche?

LOMBI 24. Sep 2006 17:58

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Nein, es passiert gar nichts!

LOMBI 24. Sep 2006 18:28

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Meine StringGrid-Einstellungen lauten:

ColCount := 9;
RowCount := 1;
Fixed Color : = clRed;
FixedCols := 8;
FixedRows := 0;

mkinzler 24. Sep 2006 18:36

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Ist .DefaultDrawing gesetzt ?

marabu 24. Sep 2006 18:54

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo Lombi,

die Index-Berechnung aus dem Borland Beispiel-Code dient nur der Wandlung vom zweidimensionalen Zellenindex zu einem eindimensionalen Array-Index. Diesen Teil kannst du wegschmeißen. Dass nichts zu sehen ist liegt wahrscheinlich daran, dass du auch keine Ausgabe machst.

Delphi-Quellcode:
procedure TFRechn.StringGridRedatDrawCell(Sender: TObject;
  ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with Sender As TStringGrid do
  begin
    if (ARow = Row) and (ACol >= FixedCols)
      then Canvas.Brush.Color := clYellow
      else Canvas.Brusch.Color := clWhite;
    Canvas.FillRect(Rect);
  end;
end;
Es gibt da noch einige Feinheiten zu beachten, aber so solltest du zumindest schon etwas sehen.

Grüße vom marabu

LOMBI 24. Sep 2006 19:00

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Ja, ist auf True;

Ich meine, es liegt an den Einstellungen meiner Titelleiste!
Die ist rot eingefärbt und hat 8 Spalten.
Wenn ich Zeilen mit Daten hinzufüge, dann sind die ebenfalls rot
und nicht wie gewünscht in weiß.

marabu 24. Sep 2006 19:03

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Deine Einstellungen sind tatsächlich etwas seltsam. Willst du wirklich 8 feststehende Spalten am linken Rand? Und Titelzeile (FixedRows) hast du gar keine festgelegt.

marabu

LOMBI 24. Sep 2006 19:23

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
@ marabu

Delphi-Quellcode:
ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
Vom Programm werden die Änderungen ACol und ARow nicht akzeptiert.

Zitat:

Deine Einstellungen sind tatsächlich etwas seltsam. Willst du wirklich 8 feststehende Spalten am linken Rand? Und Titelzeile (FixedRows) hast du gar keine festgelegt.
Also, meine Titelleiste besteht aus 8 Spalten und soll in clRed einge-
färbt sein. Das ist bei mir nur der Fall, wenn FixedCols := 8;
Jede weitere Zeile mit Daten möchte ich in weiß haben, ist aber auch
in rot.

FixedRows := 1 o.k?

Was bitte ist zu tun?

DP-Maintenance 24. Sep 2006 19:42

DP-Maintenance
 
Dieses Thema wurde von "MrSpock" von "Datenbanken" nach "VCL / WinForms / Controls" verschoben.
StringGrid ist nicht direkt mit Datenbanken verknüpft. Darum ab nach VCL.

marabu 24. Sep 2006 19:43

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Die vermeintlichen Änderungen sind bei mir so von D7 vorgegeben - du musst natürlich die von D3 vergebene Signatur benutzen. Ich wollte nur zeigen, wie die Bedingung formuliert werden muss um den von dir gewünschten gelben Balken zu erhalten. Bei D3 scheint der Header wegen der Überdeckung der Eigenschaften Col und Row mit den gleichnamigen Parametern noch nicht korrigiert worden zu sein. Du kannst die aktuellen Werte zwischenspeichern:

Delphi-Quellcode:
procedure TFRechn.StringGridRedatDrawCell(Sender: TObject;
  Col, Row: Integer; Rect: TRect; State: TGridDrawState);
var
  aCol, aRow: Integer;
begin
  aCol := Col;
  aRow := Row;
  with Sender As TStringGrid do
  begin
    if (ARow = Row) and (ACol >= FixedCols)
      then Canvas.Brush.Color := clYellow
      else Canvas.Brusch.Color := clWhite;
    Canvas.FillRect(Rect);
  end;
end;
Immernoch beschleicht mich das Gefühl, dass du Spalten und Zeilen verwechselst. Du schreibst 8 feste Titelspalten und jede weitere Zeile...

marabu

LOMBI 25. Sep 2006 19:51

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Guten Abend marabu,

Deinen Code habe ich umgesetzt. Im StringGrid ist ein gelber
Balken vorhanden, der auf Click in eine andere Zeile wechselt.

Was ich jetzt vermisse, ist meine feste Titelleiste oben mit den Bezeichnungen der Spalten.

FixedColor := clRed;
Font.Color := clBlack;

Delphi-Quellcode:
procedure TFRechn.FormCreate(Sender: TObject);
begin
  with StringGridRedat do
    begin
      ColCount := 8;   /Bezeichnung der Spalten
      RowCount := 1;  
      Cells [0,0] := 'PosNr';
      Cells [1,0] := 'Art-Nr';
      Cells [2,0] := 'Bezeichnung';
      ...
      Cells [7,0] := 'Gesamtpreis';
  end;
Wie kommt bitte die Titelleiste mit den Bezeichnungen
ins StringGrid? Ebenso kann ich dem StringGrid keine
Artikeldaten hinzufügen. Die neuen Zeilen bleiben alle leer!

Gute Nacht!

marabu 26. Sep 2006 18:51

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo Lombi,

in Beitrag #4 hast du angegeben, dass du die Eigenschaft FixedRows auf null gesetzt hast. Diese Eigenschaft muss auf eins gesetzt werden, damit eine Titelzeile sichtbar ist. Eine Nebenbedingung ist, dass RowCount größer als FixedRows sein muss, sonst funktioniert das nicht. Was das Hinzufügen von Datenzeilen angeht musst du mal deinen aktuellen nicht funktionierenden Code zeigen.

Grüße vom marabu

LOMBI 27. Sep 2006 10:38

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo marabu,

bitte schau Dir mal die Demo an. Mit OnDrawCell werden meine Spalten-
bezeichnungen nicht angezeigt.

Gruß
Lombi

marabu 27. Sep 2006 19:30

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo Lombi,

du schreibst ja auch gar keinen Text raus. Hinter FillRect() gehört noch diese Zeile:

Delphi-Quellcode:
 Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
Durch FillRect() hast du die bereits ausgegebenen Texte wieder überpinselt. Deshalb nochmal mit TextRect() oder TextOut() ausgeben.

Grüße vom marabu

LOMBI 28. Sep 2006 16:05

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo marabu!

zwei Kleinigkeiten fehlen noch in meinem StringGrid:

1.) RowCount := 2; FixedRows := 1; für die Titelzeile
Beim Ausführen des Prog ist die Titelzeile und schon eine weitere
Zeile vorhanden (RowCount:= 2), d.h. die Eingabe der ersten Artikel-
position (über Edits) beginnt nicht unmittelbar unter der Titelzeile.

2.) Wie bitte bekomme ich FixedColor := clInfoBk; in die Titelzeile?

Viele Grüße
Lombi

marabu 28. Sep 2006 20:45

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo Lombi,

dein zweites Problem ist am einfachsten zu lösen:

Delphi-Quellcode:
procedure TDemoForm.StringGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do
  begin
    if (ARow < FixedRows) or (ACol < FixedCols) then
      Canvas.Brush.Color := clInfoBk else
      // ...
  end;
end;
Bei deinem ersten Problem hilft nur ein eigenes book keeping. Du musst um die Optik zu erhalten einen eigenen RowCount pflegen und den RowCount des Grid nie unter 2 fallen lassen. Beim Löschen der letzten Zeile musst du dann die Cells von Row[1] alle leeren und beim Hinzufügen der ersten Zeile schreibst du deine Werte einfach in die bereits existierende Row[1].

Gute Nacht

marabu

LOMBI 5. Okt 2006 16:09

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Verzweifelt suche ich noch nach einer Lösung für das eigene book keeping.

Die Procedure löscht die 1.Zeile im StringGrid, nimmt aber auch die Titel-
zeile weg.

Delphi-Quellcode:
procedure DeleteFirstRow(const: Grid : TStringGrid; RowNumber : Integer);
var
  i: Integer;
begin
  for i := RowNumber to Grid.RowCount -2 do
  Grid.Rows[i].Assign(Grid.Rows [i -1]);
  Grid.Rows [Grid.RowCount -1].Clear;
  Grid.RowCount := Grid.RowCount-1;
end;

procedure TFRechn.BtnNeuClick(Sender: TObject);
...
DeleteFirstRow(StringGridRedat, 1);
...
Gruß
Lombi

marabu 5. Okt 2006 18:27

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Lombi,

nicht verzweifeln. Ich habe dir eine Demo angehängt, die dir mit möglichst wenig Code das Prinzip zeigt. Hoffentlich kannst du sie unter D3 übersetzen.

Grüße vom marabu

LOMBI 25. Okt 2006 18:19

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
@marabu

Herzlichen Dank für Deine Demo.

Delphi-Quellcode:
procedure TFormKundenListe.BtnKundeNeuClick(Sender: TObject);
var
  s: TStrings;
  iCol: Integer;
begin
  with FormKunden, QueryKunden, GridKunden do
    begin
      FormKunden.ShowModal;
      Append;
      FieldByName('Name1').AsString := EditName1.Text;
      ...
      if LineCount > 0 then  
        begin
          iCol := Col;
          InsertRow(GridKunden, icol);
          Row := Pred(Row);
        end;
          ***********************************************
          for iCol := FixedCols to Pred(ColCount) do
          Cells[iCol, Row] := IntToStr(Random(90) + 10);
          SetFocus;
         ************************************************ 
       end;
         LineCount := LineCount + 1;
       end;
Durch was muß ich bitte die markierte Stelle im Code ersetzen, um meine Kundendaten ins Grid zu bekommen?

Beste Grüße
Lombi

marabu 26. Okt 2006 07:19

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo Lombi,

deine Kundendaten stehen wohl noch in einer Query-Komponente (QueryKunden) zur Verfügung. Du kannst sie von dort nehmen, aber wenn die Felder der Query nicht mit den Spalten des Grid korrelieren, dann musst du erst ein Mapping von Spaltenindex auf Feldindex bereitstellen - oder du verzichtest auf die Schleife:

Delphi-Quellcode:
//  ...
    Cells[1, Row] := FieldbyName('Name1').AsString;
    Cells[2, Row] := FieldbyName('Name2').AsString;
//  ...
Freundliche Grüße

LOMBI 26. Okt 2006 12:13

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Hallo marabu,

wenn ich aus meinem Code "FormKunden.Show" entferne, dann läuft alles
wie auf Deiner Demo ab. Die Zahlenreihen beginnen mit der ersten Zeile.
Irgendwie beschleicht mich das Gefühl, dass für meine Zwecke nachstehender
Passus geändert werden müßte, damit statt der Zahlen meine Kundendaten ab
Zeile 1 eingetragen werden.

Zitat:

for iCol := FixedCols to Pred(ColCount) do
Cells[iCol, Row] := IntToStr(Random(90) + 10);
SetFocus;
Die Felder der QueryKunden korrelieren mit den Spalten des Grid:

Delphi-Quellcode:
procedure TFormKunden.BtnSpeichernClick(Sender: TObject);
var
  inZeile: Integer;
begin
  with FormKundenListe, GridKunden, QueryKunden do
    begin
      inZeile := RowCount;
      RowCount := RowCount + 1;
      Cells[0, inZeile] := FieldByName('Name1').AsString;
      Cells[1, inZeile] := FieldByName('Name2').AsString;
      ...
Viele Grüße

marabu 26. Okt 2006 12:36

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Delphi-Quellcode:
for iCol := FixedCols to Pred(ColCount) do
  Cells[iCol, Row] := IntToStr(Random(90) + 10);
SetFocus;
Dieser Code schreibt Zufallszahlen in die ausgewählte Grid-Zeile - den brauchst du nicht.

Grüße

LOMBI 26. Okt 2006 14:34

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Ja, dann stehe ich aber wieder vor meinem Problem 1.) aus #16.
Der Kundeneintrag im Grid beginnt auf Zeile 2 und nicht ganz oben!

LOMBI 26. Okt 2006 15:27

Re: In StringGrid-Zeilen mit einem Balken navigieren
 
Delphi-Quellcode:
procedure TFormKunden.BtnSpeichernClick(Sender: TObject);
var
  inZeile: Integer;
begin
  with FormKundenListe, GridKunden, QueryKunden do
    begin
      inZeile := RowCount;
      Cells[0, inZeile] := FieldByName('Name1').AsString;
      Cells[1, inZeile] := FieldByName('Name2').AsString;
      ...
"RowCount := RowCount + 1;" habe ich aus dem Code genommen.
Jetzt beginnt der Eintrag zwar in der 1.Zeile des Grids, jedoch
erst beim nächsten BtnKundeNeuClick. Die Daten sollten bereits
nach dem OnPost im Grid erscheinen. Auch OnBeforePost half nichts!


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