Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   StringGrid Zeile einfärben (https://www.delphipraxis.net/183285-stringgrid-zeile-einfaerben.html)

strom 28. Dez 2014 11:08

StringGrid Zeile einfärben
 
Hallo,

was ist hier falsch am Code? :shock:
leider bekomme ich auch keine Fehlermeldung ?

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
   c : TColor;
begin
   if StringGrid1.Cells[3,Arow]='1' then
      c:=clYellow
   else
      if StringGrid1.Cells[3,Arow]='2' then
         c:=clFuchsia
      else
         if StringGrid1.Cells[3,Arow]='3' then
            c:=clRed;
   if gdSelected in State then
      c:=clred;
   StringGrid1.Canvas.FillRect(Rect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   StringGrid1.Canvas.TextRect(Rect,Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]);
end;

Bjoerk 28. Dez 2014 11:14

AW: StringGrid Zeile einfärben
 
Welchen Wert hat c wenn keine der Bedingungen erfüllt ist? Und wo wird c verwendet?

himitsu 28. Dez 2014 11:16

AW: StringGrid Zeile einfärben
 
Leider bekommen wir auch keine Beschreibung was passiert, bzw. was nicht passiert und was eigentlich passieren sollte.

Zitat:

leider bekomme ich auch keine Fehlermeldung ?
Doch, das bekommst du!

Zitat:

was ist hier falsch am Code?
DU hast vergessen auf deinen Compiler zu hören und somit die beiden Fehler nicht beachtet.
  • c ist nicht initialisiert
  • c wird nicht verwendet

strom 28. Dez 2014 12:32

AW: StringGrid Zeile einfärben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für Eure Hilfe :)

Es geht jetzt!!

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   if StringGrid1.Cells[3,Arow]='1' then begin
    StringGrid1.Canvas.Brush.Color := clYellow;
    StringGrid1.Canvas.Font.Color := clblack;

  end else
      if StringGrid1.Cells[3,Arow]='2' then
       StringGrid1.Canvas.Brush.Color := clred;
       StringGrid1.Canvas.Font.Color := clblack;
   if gdSelected in State then
        StringGrid1.Canvas.Brush.Color := clred;
        StringGrid1.Canvas.Font.Color := clblack;
   StringGrid1.Canvas.FillRect(Rect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   StringGrid1.Canvas.TextRect(Rect,Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]);
end;
Noch eine Zusatzfrage, (siehe Bild) wieso wird die erste Spalte mit eingefärbt? Beim selektieren nicht!

Sir Rufo 28. Dez 2014 12:42

AW: StringGrid Zeile einfärben
 
Weil die festen Spalten niemals den Status
Delphi-Quellcode:
gdSelected
haben?

Und wenn du den Code richtig formatierst, dann sieht man auch etwas klarer:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState );
begin
  if StringGrid1.Cells[3, ARow] = '1'
  then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;
      StringGrid1.Canvas.Font.Color := clblack;

    end
  else if StringGrid1.Cells[3, ARow] = '2'
  then
    StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.Font.Color := clblack;
  if gdSelected in State
  then
    StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.Font.Color := clblack;
  StringGrid1.Canvas.FillRect( Rect );
  StringGrid1.Canvas.Font.Color := clblack;
  StringGrid1.Canvas.TextRect( Rect, Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow] );
end;
Du setzt an drei Stellen immer
Delphi-Quellcode:
StringGrid1.Canvas.Font.Color := clblack;
. Wozu das?

Das macht exakt das Gleiche:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState );
begin
  StringGrid1.Canvas.Font.Color := clblack;

  if StringGrid1.Cells[3, ARow] = '1'
  then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;
    end
  else if StringGrid1.Cells[3, ARow] = '2'
  then
    StringGrid1.Canvas.Brush.Color := clred;
  if gdSelected in State
  then
    StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.FillRect( Rect );
  StringGrid1.Canvas.TextRect( Rect, Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow] );
end;

vagtler 28. Dez 2014 12:57

AW: StringGrid Zeile einfärben
 
Oder noch kürzer:

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState );
begin
  StringGrid1.Canvas.Font.Color := clblack;

  if (gdSelected in State) or (StringGrid1.Cells[3, ARow] = '2') then
    StringGrid1.Canvas.Brush.Color := clRed
  else if StringGrid1.Cells[3, ARow] = '1' then
    StringGrid1.Canvas.Brush.Color := clYellow;

  StringGrid1.Canvas.FillRect( Rect );
  StringGrid1.Canvas.TextRect( Rect, Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow] );
end;

strom 28. Dez 2014 14:11

AW: StringGrid Zeile einfärben
 
Vielen Dank für die erfolgreiche Hilfe hier im Forum! 8-)

Wenn ich jetzt noch ein Icon aus einer ImageList hinzufügen möchte,
muss ich was beachten?

Dieses hier funktioniert leider nicht!

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var
  X, Y: Integer;
begin
 StringGrid1.Canvas.Font.Color := clblack;

  if StringGrid1.Cells[3, ARow] = '1'
  then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;
      ImageList1.Draw(StringGrid1.Canvas, X, Y, 0, true); // Was ist hier falsch? 
    end
  else if StringGrid1.Cells[3, ARow] = '2'
  then
    StringGrid1.Canvas.Brush.Color := clgray;
  if gdSelected in State
  then
    StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.FillRect( Rect );
  StringGrid1.Canvas.TextRect( Rect, Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow] );
end;

Aviator 28. Dez 2014 14:15

AW: StringGrid Zeile einfärben
 
Wie sind denn die Werte von X und Y? Du deklarierst zwar die Variablen, weißt diesen aber keine Werte zu. Somit sind die undefiniert und können irgendwo in einem negativen Bereich liegen. Auch hier hast du die Compiler Meldung nicht beachtet. Der schreibt nämlich genau das hin.

Weise also den beiden Variablen einen Wert zu und schon müsste das funktionieren.

Hier vielleicht noch ein Tipp. Delphi-Referenz durchsuchenMouse.CursorPos, Delphi-Referenz durchsuchenScreenToClient oder Delphi-Referenz durchsuchenClientToScreen könnten hier fürs erste helfen. Du könntest als X und Y Werte die passenden Rect.Top und Rect.Left Werte übernehmen.

himitsu 28. Dez 2014 15:07

AW: StringGrid Zeile einfärben
 
Zitat:

Zitat von strom (Beitrag 1284854)
// Was ist hier falsch?

Zitat:

Zitat von Aviator (Beitrag 1284855)
Wie sind denn die Werte von X und Y? Du deklarierst zwar die Variablen, weißt diesen aber keine Werte zu. ...

Ich kann mich nur noch einmal wiederholen und hoffen der TE hört endlich mal auf das, was ihm jemand sagt und beachtet es auch.
Zitat:

Zitat von himitsu (Beitrag 1284845)
Zitat:

was ist hier falsch am Code?
DU hast vergessen auf deinen Compiler zu hören und somit die beiden Fehler nicht beachtet.
  • c ist nicht initialisiert
  • c wird nicht verwendet


strom 28. Dez 2014 16:21

AW: StringGrid Zeile einfärben
 
hallo,

dieses funktioniert leider auch nicht!

Delphi-Quellcode:
var
  X, Y: Integer;
begin
  if StringGrid1.Cells[3, ARow] = '1'
   then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;  
    X := Rect.Left;
    Y := Rect.Top;
    ImageList1.Draw(StringGrid1.Canvas, X, Y, 0, true); { 0 = erstes Image in ImageList }
  end;
end;

Perlsau 28. Dez 2014 17:13

AW: StringGrid Zeile einfärben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Funktioniert nicht ...

... ist keine Fehlermeldung, sondern eine Verallgemeinerung. Wenn du konkrete Hilfe willst, solltest du auch konkret fragen und konkrete Hinweise liefern.
Danke.

Und wenn du in eine bestimmte Zelle zeichnen willst, ist es eigentlich kontraproduktiv, auf den Canvas der zugrundeliegenden Komponente zu zeichnen. Wenn du dir einmal die Mühe machen würdest, die Suchfunktion des Forums zu verwenden, hättest du mit Sicherheit schon etliche funktionierende Codeschnipsel gefunden, die dir genau zeigen, wie man in bestimmte Zellen eines Stringgrids zeichnet.

Blup 29. Dez 2014 10:49

AW: StringGrid Zeile einfärben
 
Gehn wir mal die Schritte in der jetzt ausgeführten Reihenfolge durch:

- eine Farbe wird ausgewählt
- ein Icon wird in die Zelle gezeichnet
- das ganze Rechteck der Zelle wird mit der ausgewählen Farbe übermalt
- der Text wird in die Zelle gezeichnet

Und jetzt denken wir ein bischen drüber nach...

Frau Müller 13. Jan 2015 00:33

AW: StringGrid Zeile einfärben
 
Kann mir (Anfängerin :roll:) bitte jemand helfen?

Ich habe ein StringGrid und 2x ComboBox. Ich würde gerne folgendes tun:

Ist ComboBox1.ItemIndex=1 gewählt dann blende mir die Zeile 1-3 vom StringGrid1 aus.
Ist ComboBox2.ItemIndex=3 gewählt dann blende mir die Spalte 2-4 vom StringGrid1 aus.

Kann mir bitte jemand einen Quellcode geben? :oops:

Frau Müller 13. Jan 2015 00:36

AW: StringGrid Zeile einfärben
 
noch besser wäre es die zeilen bleiben sichtbar können aber nicht angeklickt werden :lol:

Frau Müller 13. Jan 2015 00:51

StringGrid Zellen nicht anklicken
 
......................

himitsu 13. Jan 2015 01:15

AW: StringGrid Zeile einfärben
 
Über OnSelectCell (TStringGrid) kann man erkennen was selektiert wird/wurde und könnte da die Selektion umschreiben, wenn nicht gewoll.

Ausblenden geht nicht, da TStringGrid keinen (Zeilen)Filter besitzt.
Beim TDBGrid geht das, über die Filterung des DataSets, welches auch ohne DB genutzt werden kann. (z.B. TClientDataSet)


Alternativ macht man es "richtig".
StringGrid nur zur Datenanzeige (und als Editor), aber die Datenhaltung liegt wo anders ... dann zeigt/läd man nur das ins Grid, was angezeigt werden soll.

Sir Rufo 13. Jan 2015 07:33

AW: StringGrid Zeile einfärben
 
Man belege den Event Delphi-Referenz durchsuchenTStringGrid.OnSelectCell und schaue sich dieses Beispiel an:

http://docwiki.embarcadero.com/CodeE...ctCell_(Delphi)

Frau Müller 13. Jan 2015 10:04

AW: StringGrid Zeile einfärben
 
Ich denke so könnte es klappen aber er zeigt mir eine Felhermeldung an

[Error] Unit1.pas(175): Type of expression must be BOOLEAN



procedure TForm1.ZellenNICHTanklicken(Sender: TObject);
begin
If ComboBox1.ItemIndex of
0: with StringGrid1 do begin
Cells[2,2]:='';
end;
end;
end;

DeddyH 13. Jan 2015 10:07

AW: StringGrid Zeile einfärben
 
Mach mal aus dem If ein Case. Und schließe bitte künftig Quellcode in Delphi-Tags ein (die "Helm"-Schaltfläche im Beitragseditor), dann ist er viel besser zu lesen.

himitsu 13. Jan 2015 10:48

AW: StringGrid Zeile einfärben
 
Zitat:

Delphi-Quellcode:
Cells[2,2]:='';

Das hat natürlich nichts mit "nicht anklicken" zu tun, sondern macht nur den Zelleninhalt "leer".



-> StringGrid1.Selection eine andere Zelle zuweisen, wenn die aktuelle Zelle nicht selektiert werden darf.

Frau Müller 13. Jan 2015 10:58

AW: StringGrid Zeile einfärben
 
Juhu :-) Die Fehlermeldung ist weg und es funktioniert! Danke schon mal! Kann man hier viell statt die einzelnen zellen zu benennen sagen Spalte 1-3 und 6-7 ausblenden bzw Zeile 2-3 ausblenden?


procedure TForm1.ZellenNICHTanklicken(Sender: TObject);
begin
Case ComboBox1.ItemIndex of
0: with StringGrid1 do begin
Cells[4,4]:='';
Cells[8,4]:='';
end;
end;
end;

Frau Müller 13. Jan 2015 11:00

AW: StringGrid Zeile einfärben
 
ja das stimmt '' hat nichts mit Selected zu tun. Ich komme leider mit dem Begriff nicht weiter, sprich weiß nicht wie der quellcode aussehen sollte :oops: .
Ich will nur verhindern das der User auf diese Daten zugreift.

Delbor 13. Jan 2015 12:00

AW: StringGrid Zeile einfärben
 
Hi Frau Müller

Delphi-Quellcode:
procedure TCM_First.StrGridSchemaSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
// Wird ausgeführt, bevor eine Zelle angeklickt wird.
// ACol bezeichnet die Spalte, auf die geklickt wird
// ARow die Zeile und
// CanSelect bestimmt, obdie Zelle ausgewählt werden kann
end;
Von hier aus könntest du deine Prozedur(Mach daraus eine Funktion) NichtAuswählen aufrufen und da prüfen, welches Item in der Combobox ausgewählt ist. Mit dem Aufruf übergibst du 2 Integer-Parameter für ACol und ARow.
Willst du zB., dass Zeile[1,1] nicht ausgewählt werden kann, vergleichst du den Indexwert der Combobox mit ACol und ARow. Wenn deine Bedingungen, die Zelle nicht selektieren zu lassen, erfüllt sind, stellst du Result auf false.
In SelectCell schreibst du dann:

Delphi-Quellcode:
CanSelect := NichtAuswählen;


Das ruft deine Funktion auf und übergibt an Canselect den Boolenwert, den du an Result zugewiesen hast.

Gruss
Delbor

Frau Müller 13. Jan 2015 13:16

AW: StringGrid Zeile einfärben
 
Delbor ich verstehe nicht was du mir sagen willst :oops: . Ich beschäftige mich mit delphi erst seit einer woche. Im Anhang siehst du was ich meine. Wäre schön wenn die zeilen nicht verschwinden, sondern nur nicht anklickbar wären


//diese Procedure habe ich dem StringGrid1 (Events: OnSelectCell) zugewiesen
//hiermit werden 2 oder mehrer zellen markiert..
//procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Longint; var CanSelect: Boolean);
//begin
//If ComboBox1.ItemIndex=0 then
//canSelect:=(StringGrid1.Cells[2, 1]='');
//end;



//Procedure zugewiesen ComboBox1 (Events: OnClick)
//dieses Ereignis hätte ich gerne. Die Zellen sollten idealerweise nicht
//verschwinden sondern nicht anklickbar sein

procedure TForm1.ZellenNICHTanklicken(Sender: TObject);
begin
Case ComboBox1.ItemIndex of
0: with StringGrid1 do begin
Cells[3,1]:=''; Cells[3,2]:=''; Cells[3,3]:=''; Cells[3,4]:='';
Cells[4,1]:=''; Cells[4,2]:=''; Cells[4,3]:=''; Cells[4,4]:='';
end;
1: with StringGrid1 do begin
Cells[2,1]:=''; Cells[2,2]:=''; Cells[2,3]:=''; Cells[2,4]:='';
Cells[4,1]:=''; Cells[4,2]:=''; Cells[4,3]:=''; Cells[4,4]:='';
end;
2: with StringGrid1 do begin
Cells[2,1]:=''; Cells[2,2]:=''; Cells[2,3]:=''; Cells[2,4]:='';
Cells[3,1]:=''; Cells[3,2]:=''; Cells[3,3]:=''; Cells[3,4]:='';
end;
end;
end;

Frau Müller 13. Jan 2015 13:23

AW: StringGrid Zeile einfärben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anhang 42437

Klaus01 13. Jan 2015 13:27

AW: StringGrid Zeile einfärben
 
Hallo,

vielleicht hilft Dir der Thread(String Zellen readonly) weiter?

Grüße
Klaus

Sir Rufo 13. Jan 2015 13:42

AW: StringGrid Zeile einfärben
 
Also es es wäre zuckersüß, wenn man Delphi-Sourcecode auch in die dafür vorgesehenen Delphi-Tags packen könnte:
Code:
[DELPHI]
procedure foo;
begin
  // do something
end;
[/DELPHI]
Dann sieht das so aus:
Delphi-Quellcode:
procedure foo;
begin
  // do something
end;
Toll, gell?

So jetzt mal zum Thema (ähm, welchem eigentlich):
Delphi-Quellcode:
unit Form.Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls;

type
  TForm1 = class( TForm )
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    StringGrid1: TStringGrid;
    procedure StringGrid1SelectCell( Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean );
  private
    function CanSelectCell( ACol, ARow: Integer ): Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.CanSelectCell( ACol, ARow: Integer ): Boolean;
begin
  Result := not(
    {} ( ( ComboBox1.ItemIndex = 1 ) and ( ACol >= 0 ) and ( ACol <= 2 ) ) or
    {}( ( ComboBox2.ItemIndex = 1 ) and ( ARow >= 1 ) and ( ARow <= 3 ) ) );
end;

procedure TForm1.StringGrid1SelectCell( Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean );
begin
  CanSelect := CanSelectCell( ACol, ARow );
end;

end.
Die Werte muss man eventuell noch anpassen, denn die Zeilen und Spalten sind 0 basiert, heisst also die erste Spalte ist die Spalte 0, analog mit der Zeile.
Und bei der ComboBox sieht es genauso aus, der erste Eintrag hat den ItemIndex 0.

Frau Müller 13. Jan 2015 14:55

AW: StringGrid Zeile einfärben
 
:-D Ja wirklich Toll!

Ich habs eingetragen und Delphi zeigt keine Fehlermeldung an... nun versteh ich nicht wie ich wie ich der ComboBox sage führe mir die ''procedure StringGrid1SelectCell'' bzw. die ''funktion CanSelectCell'' aus.
Eigentlich mach ich das über ObjectInspector --> Events --> Ereignis wählen ? :oops: Hier wird mir allerdings nirgends die procedure angezeigt.

Vielen Dank! :cheer:

DeddyH 13. Jan 2015 15:01

AW: StringGrid Zeile einfärben
 
http://docwiki.embarcadero.com/Libra...d.OnSelectCell
Zitat:

Tritt ein, bevor eine Gitterzelle ausgewählt wird.

In einer Ereignisbehandlungsroutine für OnSelectCell können Sie verhindern, dass eine bestimmte Gitterzelle ausgewählt wird. Die Parameter Col und Row bezeichnen die Position der betreffenden Zelle. Setzen Sie den Parameter CanSelect auf False, um zu verhindern, dass die Zelle ausgewählt wird.

Frau Müller 13. Jan 2015 19:46

AW: StringGrid Zeile einfärben
 
Nun habe ich 4 StringGrids in Form1. In jedem StringGrid ist eine zelle (Cels 0,0) markiert. Das sieht zum einem doof aus, zum anderem liest er mir natürlich falsche werte raus. Ich hätte gerne die zelle unmarkiert, sprich öffne ich mein Form1 dann soll keine zelle markiert sein erst beim ersten Mausklick markiere ich eine zelle. :duck:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz