![]() |
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:
Leider funktioniert mein Code nicht. Die Titelzeile (Cell[0])soll nicht markiert werden. Wer hilft mir bitte?
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; Gruß Lombi |
Re: In StringGrid-Zeilen mit einem Balken navigieren
Was funktioniert nicht? macht er garnichts oder das Falsche?
|
Re: In StringGrid-Zeilen mit einem Balken navigieren
Nein, es passiert gar nichts!
|
Re: In StringGrid-Zeilen mit einem Balken navigieren
Meine StringGrid-Einstellungen lauten:
ColCount := 9; RowCount := 1; Fixed Color : = clRed; FixedCols := 8; FixedRows := 0; |
Re: In StringGrid-Zeilen mit einem Balken navigieren
Ist .DefaultDrawing gesetzt ?
|
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:
Es gibt da noch einige Feinheiten zu beachten, aber so solltest du zumindest schon etwas sehen.
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; Grüße vom marabu |
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ß. |
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 |
Re: In StringGrid-Zeilen mit einem Balken navigieren
@ marabu
Delphi-Quellcode:
Vom Programm werden die Änderungen ACol und ARow nicht akzeptiert.
ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
Zitat:
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
Dieses Thema wurde von "MrSpock" von "Datenbanken" nach "VCL / WinForms / Controls" verschoben.
StringGrid ist nicht direkt mit Datenbanken verknüpft. Darum ab nach VCL. |
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:
Immernoch beschleicht mich das Gefühl, dass du Spalten und Zeilen verwechselst. Du schreibst 8 feste Titelspalten und jede weitere Zeile...
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; marabu |
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:
Wie kommt bitte die Titelleiste mit den Bezeichnungen
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; ins StringGrid? Ebenso kann ich dem StringGrid keine Artikeldaten hinzufügen. Die neuen Zeilen bleiben alle leer! Gute Nacht! |
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 |
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 |
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:
Durch FillRect() hast du die bereits ausgegebenen Texte wieder überpinselt. Deshalb nochmal mit TextRect() oder TextOut() ausgeben.
Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
Grüße vom marabu |
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 |
Re: In StringGrid-Zeilen mit einem Balken navigieren
Hallo Lombi,
dein zweites Problem ist am einfachsten zu lösen:
Delphi-Quellcode:
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].
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; Gute Nacht marabu |
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:
Gruß
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); ... Lombi |
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 |
Re: In StringGrid-Zeilen mit einem Balken navigieren
@marabu
Herzlichen Dank für Deine Demo.
Delphi-Quellcode:
Durch was muß ich bitte die markierte Stelle im Code ersetzen, um meine Kundendaten ins Grid zu bekommen?
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; Beste Grüße Lombi |
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:
Freundliche Grüße
// ...
Cells[1, Row] := FieldbyName('Name1').AsString; Cells[2, Row] := FieldbyName('Name2').AsString; // ... |
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:
Delphi-Quellcode:
Viele Grüße
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; ... |
Re: In StringGrid-Zeilen mit einem Balken navigieren
Delphi-Quellcode:
Dieser Code schreibt Zufallszahlen in die ausgewählte Grid-Zeile - den brauchst du nicht.
for iCol := FixedCols to Pred(ColCount) do
Cells[iCol, Row] := IntToStr(Random(90) + 10); SetFocus; Grüße |
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! |
Re: In StringGrid-Zeilen mit einem Balken navigieren
Delphi-Quellcode:
"RowCount := RowCount + 1;" habe ich aus dem Code genommen.
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; ... 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