Autor Beitrag
HeelX
Hält's aus hier
Beiträge: 10

WinXP Home

BeitragVerfasst: Do 11.05.06 17:27 
Hallo,

habe mich durchs Forum gewühlt bezüglich Fonts festlegen für einzelne Zellen eines Stringgrids und so.. aber ich habe folgendes Problem:

in meinem OnDrawCell Event soll der String der Zelle in der 2ten Spalte, die berührt wird, fett dargestellt werden, ansonsten normal:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TticketOverview.ticketListingDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var mcol, mrow: integer;
begin

      //fett nur für Zellen in der 2ten Spalte
      if (acol = 1then
      begin
         //berührte Zelle herausfinden
         ticketlisting.MouseToCell(mouse.CursorPos.x, mouse.CursorPos.y, mCol, mRow);

         //debug
         label1.caption := inttostr(mcol) + '/' + inttostr(mrow);

         //nur, wenn die Maus die aktuelle Zelle berührt
         if (mcol = acol) and (mrow = arow) then
         begin
            with (Sender as TStringGrid) do
            begin
               Canvas.Font.Style := Canvas.Font.Style + [fsBold]; //fett zeichnen
               Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[mCol, mRow]);
            end;
         end;
      end;
end;


damit der Event immer ausgelöst wird, wenn der Mauszeiger die Komponente berührt, führe ich immer folgendes aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TticketOverview.ticketListingMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
   ticketListing.repaint;
end;


Ich finde keinen Fehler, schließlich erzwinge ich ja quasi durch repaint dass im drawcell event immer die aktuelle Mausposition erkannt wird...

komisch...

mfG
Christian

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 11.05.06 19:46 
Hallo

in deinem Post fehlt irgendwie die Fehlerbeschreibung. Mir fehlt in deinem Code, das du zwar den fontstyle setzt, aber ihn nie wieder zurücksetzt. Du wirst wahrscheinlich aber überhaupt nichts sehen, da dein mousetocell höchstwahrscheinlich nicht funktioniert. Du übergibst die Screen-Mouse-kooridnaten, mousetocell erwartet die mouse-koordinaten innerhalb des Grids. da fehlt ein screentoclient.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
 Var p:Tpoint;
...
    p:=StringGrid1.ScreenToClient(mouse.CursorPos);
    StringGrid1.MouseToCell(p.x,p.y, mCol, mRow);

ich persönlich würds anders lösen und nicht beim ondraw mousetocell aufrufen und auch nicht jedesmal das komplette Grid neuzeichnen. Wenn Du pech und einen langsameren Rechner hast, kann es durchaus sein, das du das neuzeichnen siehst oder es zu leicht spürbaren Verzögerungen kommt.

in etwa so, nicht groß weiter probiert:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
type
  TGridhack=class(TStringGrid);

  TForm1 = class(TForm)
  ...
  private
    { Private-Deklarationen }
    FMouseCol,FMouseRow:integer;
...

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer);
Var Acol,aRow:integer;
begin
  with sender as TStringGrid do
    begin
      MouseToCell(x,y,Acol,Arow);
      //hier ist kein screentoclient notwendig

      //nur neuzeichnen, wenn wirklich notwendig und nur die Zellen neuzeichnen, die es wirklich betrifft, nicht das ganze Grid
      if (Acol<>FMouseCol) or (aRow<>FMouseRow) then
        begin
          //alte Zelle neuzeichnen, um Font zurückzusetzen
          TGridhack(Sender).InvalidateCell(FMouseCol,FMouseRow);
          FMouseCol:=acol;
          FMouseRow:=arow;
          //neue Zelle neuzeichnen (fett)
          TGridhack(Sender).InvalidateCell(FMouseCol,FMouseRow);
        end;
    end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do
    begin
      If (Acol=1and (Acol=FMouseCol) and (ARow=FMouseRow) then
        canvas.Font.Style:=[fsbold]
       else
        canvas.Font.Style:=[];

      //Hintergrunde + Text Zeichnen
      canvas.FillRect(rect);
      canvas.TextOut(rect.Left+2,rect.Top+2,Cells[acol,arow]);
    end;
end;


Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
HeelX Threadstarter
Hält's aus hier
Beiträge: 10

WinXP Home

BeitragVerfasst: Do 11.05.06 20:16 
Ja, gut, ich hätte vielleicht schreiben sollen dass der beabsichtigte Effekt nicht auftritt, da haben Sie recht.

Also.. erst einmal vielen Dank für den Tipp. Diese "Schlieren" beim kompletten repaint sind mir auch aufgefallen und die Idee vom partiellen neuzeichnen ging mir auch durch den Kopf.. :)

Aber da stellen sich bei mir noch ein paar Fragen: Sie müssen sie nicht beantworten, eine URL zu der Beschreibung oder so würde mir auch weiterhelfen:

1. TStringgrid wird ja von TCustomGrid abgeleitet.. aber wieso habe ich in TStringgrid nur die invalidate Methode und nicht direkt Zugriff auf die InvalidateCell Methode, wenn es doch von TCustomgrid abgeleitet ist? Deshalb wird wahrscheinlich bei Ihnen der Umweg auch mit folgendem gemacht:...

2. TGridhack=class(TStringGrid); --- warum wird denn nochmal eine Instanz eines Stringgrids erzeugt? und wieso rufe ich die InvalidateCell Methode darüber auf?

Ich wollte jetzt nicht nur nen C&P machen, sondern auch verstehen wieso das nicht direkt über mein Stringgrid Objekt direkt geht.

Vielen Dank!
mfG
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 11.05.06 21:21 
Hier im Forum sagt man Du ;-)

1. invalidateCell, -col, -row sind alle nur protected und somit nur in abgeleiteten Klasse direkt sichtbar.

2. Tgridhack(Stringgrid) ist nur ein Typecast und nein, es wird keine neue Instanz erzeugt. Du leitest Tgridhack nur vom Tstringgrid ab. Tcustomgrid(Sender) geht nicht, da so nicht auf die protected Methoden zugegriffen werden kann.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
HeelX Threadstarter
Hält's aus hier
Beiträge: 10

WinXP Home

BeitragVerfasst: Fr 12.05.06 11:17 
Dank dir ;)

Ja.. gut.. aber weder steht in der Hilfe unter InvalidateCell (TCustomGrid) noch unter Invalidate (TStringGrid), das ersteres nicht direkt verfügbar (protected) ist? Oder ist das allgemein so?

Im Grunde ist meine Ursprungsfrage geklärt, also hake ich den Thread mal ab.

mfG
Christian

_________________
// we hate fun
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 12.05.06 17:45 
welche Delphiversion verwendest du?

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
HeelX Threadstarter
Hält's aus hier
Beiträge: 10

WinXP Home

BeitragVerfasst: Fr 12.05.06 18:18 
Zur Zeit übe und experimentiere ich mit Delphi 6 von einem Arbeitskollegen, um überhaupt das Ganze mal kennenzulernen. Hat mir gut gefallen soweit, ich hab mir gestern die Version "Delphi 2005 Personal Edition" nachbestellt (war als .ISO auf der Heft-DVD einer Ausgabe der CT' beigelegt, kostenlos registrierbar und wenn man eine einzelne Person ist, auch kommerziell nutzbar, stand in der Beschreibung) So wie ich das verstanden habe, sind Delphi 6 Projekte portierbar nach 2005 und 2005 wäre besser als Delphi 6 O.o?? Ich hoffe mal das man mich jetzt nicht übers Ohr gehauen hat!!

mfG
Christian
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 12.05.06 18:22 
in der D6 hilfe hast du bei den Komponenteneigenschaften/methoden ein grünes oder gelbes kästchen davor, daran siehst du die sichtbarkeit (wird in der legende erklärt)

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
HeelX Threadstarter
Hält's aus hier
Beiträge: 10

WinXP Home

BeitragVerfasst: Fr 12.05.06 22:59 
Aha, das ist nicht schlecht! Also das mit dem typecasts hat ja wohl was mit OOP zutun.. Also kann ich immer auf diese "protected" Eigenschaften zugreifen, wenn ich nen Typecast der entsprechenden parent-klasse erstelle? Ich hatte noch nie soviel zutun mit OOP, ist alles ein wenig schwierig für mich.

Danke!