Überschriebene Prozedure wird nicht aufgerufen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Überschriebene Prozedure wird nicht aufgerufen

Beitrag von AlterMann »

Hallo

Ich seh' den Wald schon wieder vor lauter Bäumen nicht.

Ich habe eine Form mit zwei StringGrids.

Bei einem davon möchte ich die Schrift in der ersten Zeile um 90° drehen.

Mach ich es so:

Code: Alles auswählen

 
type
  TStringGrid = class(Grids.TStringGrid)
  protected
    procedure DrawCellText(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState; AText: String); override;
  end;
 
 
implementation
 
procedure TStringGrid.DrawCellText(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState; AText: String);
 
  var TextPosition: TPoint;
 
 begin
     if aRow = 0 then
     begin
      Canvas.Font.Orientation := 900;
      TextPosition.X := ARect.Left +
        ((ARect.Right - ARect.Left - Canvas.TextHeight(AText)) div 2) - 2;
      TextPosition.Y := ARect.Bottom -
        ((ARect.Bottom - ARect.Top - Canvas.TextWidth(AText)) div 2);
      Canvas.TextOut(TextPosition.X, TextPosition.Y, AText);
    end
    else
      inherited DrawCellText(ACol, ARow, ARect, AState, AText);
 end;
 

Dreht er mir die Schrift in beiden StringGrids in der ersten Zeile (nicht erwünscht)



Mach ich es jedoch so (Und ändere den Typ von TStringGrid1 auf TMyStringGrid (sowohl im QuellCode als auch in der *.lfm-Datei)):

Code: Alles auswählen

 
type
  TMyStringGrid = class(Grids.TStringGrid)
  protected
    procedure DrawCellText(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState; AText: String); override;
  end;
 
 
implementation
 
procedure TMyStringGrid.DrawCellText(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState; AText: String);
 
  var TextPosition: TPoint;
 
 begin
     if aRow = 0 then
     begin
      Canvas.Font.Orientation := 900;
      TextPosition.X := ARect.Left +
        ((ARect.Right - ARect.Left - Canvas.TextHeight(AText)) div 2) - 2;
      TextPosition.Y := ARect.Bottom -
        ((ARect.Bottom - ARect.Top - Canvas.TextWidth(AText)) div 2);
      Canvas.TextOut(TextPosition.X, TextPosition.Y, AText);
    end
    else
      inherited DrawCellText(ACol, ARow, ARect, AState, AText);
 end;
 


Dreht er mir den Text in keinem der beiden StringGrids, und die Routine TMyStringGrid.DrawCellText wird auch gar nicht erst aufgerufen.

Bitte um den entscheidenden Rippenstoß
Christian
Früher war alles besser. Und aus Holz!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Überschriebene Prozedure wird nicht aufgerufen

Beitrag von Michl »

Das, was du bei Variante 1 machst, ist ein Hack. Du überschreibst quasi das TStringGrid mit einem eigenen TStringGrid. Daher tritt jedes Verhalten, was du änderst bei jedem TStringGrid auf dem entsprechendem Formular auf.

Sauber wäre Variante 2. Dazu müsstest du allerdings auch ein TMyStringGrid auf dem Formular verwenden. Entweder du fügst es dynamisch hinzu oder du erstellst eine eigene Komponente, die das TMyStringGrid veröffentlicht. Ein bischen veraltet, doch vielleicht hilft es: http://wiki.freepascal.org/How_To_Write_Lazarus_Component/de

[Edit] Achso, wenn du weiterhin den Hack verwenden willst, könntest du auch einfach in der Methode abfragen, um welches Grid es sich handelt und wenn es das richtige ist, den Text drehen. Empfehlen würde ich es nicht, da man so über die Jahre einen schönen Mischmasch bekommt, den man später einmal nicht mehr entwirrt bekommt.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Überschriebene Prozedure wird nicht aufgerufen

Beitrag von AlterMann »

Michl hat geschrieben:Sauber wäre Variante 2. Dazu müsstest du allerdings auch ein TMyStringGrid auf dem Formular verwenden. Entweder du fügst es dynamisch hinzu oder du erstellst eine eigene Komponente, die das TMyStringGrid veröffentlicht. Ein bischen veraltet, doch vielleicht hilft es: http://wiki.freepascal.org/How_To_Write_Lazarus_Component/de

Das heißt also: Egal welchen Typ ich in meinem Quelltext hinter StringGrid1 schreibe, wenn ich eine Componente vom Formular einfüge, nimmt Lazarus den Typ den es vorher hatte? Wie wäre es wenn ich das StringGrid zur Laufzeit erst erzeuge?

[Edit] Achso, wenn du weiterhin den Hack verwenden willst, könntest du auch einfach in der Methode abfragen, um welches Grid es sich handelt und wenn es das richtige ist, den Text drehen. Empfehlen würde ich es nicht, da man so über die Jahre einen schönen Mischmasch bekommt, den man später einmal nicht mehr entwirrt bekommt.


Daran hab ich auch schon gedacht. Nachdem das auch nur ein kleines "SpinOff" meines Hauptprojektes ist, werd' ich's wohl auch so machen.

Danke
Christian
Früher war alles besser. Und aus Holz!

Antworten