DBGrid Memo

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

DBGrid Memo

Beitrag von EugenE »

Hey Leute

ich habe bei abfragen in manchen Spalten immer ein (MEMO) stehen weiß jemand wie man zb nur die ersten 20 zeichen davon anzeigt und nicht dieses MEMO ?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Indem du das DrawCell ereignis überschreibst und den text selbst zeichnest.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Kann das sein, das die Typen zwischen der Abfrage und dem Control nicht ganz passend sind (Stringlänge !).

Wenn ein Text zu lange ist, als das er von Control dargestellt werden kann, so kann das als Hinweis genommen werden. Ich nehme an die Spalte in einem Memo dargestellt, zeigt die Daten richtig an !?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Und wie zeichne ich den Text da selbst rein?

Bei der Abfrage sind 2 Spalten in MySQL auf Text, und ja wenn man diese Spalte auf einem DBMemo wird der Text angezeigt^^

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wenn der Feldtyp Blob ist wird er als (blob) oder (memo) dargestellt nicht wenn irgendwas zu lang ist.

Wie du den text da reinzeichnest kannst du aus der ensprechenden Demo ersehen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

EugenE hat geschrieben:Und wie zeichne ich den Text da selbst rein?

Bei der Abfrage sind 2 Spalten in MySQL auf Text, und ja wenn man diese Spalte auf einem DBMemo wird der Text angezeigt^^
Ganz einfach - Wie ich vermutet habe - Text ist nicht String.

Das was du machen kannst ist entweder Datenbankseitig den Text (zu verkürzen) auf String zu casten. Oder es Applikationsseitig zu machen, z.b. wie es Christian vorschlägt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Christian hat geschrieben:Wie du den text da reinzeichnest kannst du aus der ensprechenden Demo ersehen.
wenn ich wüsste welche Demo du meinst?^^

ich fand nur dieses ( welches auch funktionierte ) :
http://www.delphipraxis.net/post119700.html#119700" onclick="window.open(this.href);return false; hab es bischen verkürzt und voila es geht^^

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Mhm, find ich tatsächlich auf die schnelle nicht, war eigentlich der festen Überzeugung ich hab mir das mal aus nem lazarus example abgeguckt.

Hier mal ein Beispiel:

Code: Alles auswählen

procedure TfTasks.dgTasksDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  OldBrush : TBrush;
  OldPen : TPen;
begin
  OldBrush := TBrush.Create;
  OldBrush.Assign(Canvas.Brush);
  Oldpen := TPen.Create;
  OldPen.Assign(Canvas.Pen);
  with (Sender as TDBGrid), Canvas do
    begin
      Canvas.Brush.Style := bsSolid;
      Canvas.Pen.Color := Canvas.Brush.Color;
      Canvas.Rectangle(Rect);
      if Column.FieldName = 'ACTIVE' then
        begin;
          if Data.Tasks.DataSet.FieldByName('ACTIVE').AsString = 'Y' then
            TreeImages.Draw(Canvas,Rect.Left+1,Rect.Top+1,1,True)
          else
            TreeImages.Draw(Canvas,Rect.Left+1,Rect.Top+1,0,True);
        end
      else if Column.FieldName = 'SUMMARY' then
        begin
          if Data.Tasks.DataSet.FieldByName('PERCENT').AsInteger = 100 then
            Canvas.Font.Color := clGrayText
          else
            Canvas.Font.Color := clWindowText;
          if Data.Tasks.DataSet.FieldByName('COMPLETED').AsString = 'Y' then
            Canvas.Font.Style := [fsStrikeOut]
          else
            Canvas.Font.Style := [];
          Canvas.Font.Color := clWindowText;
          Canvas.TextOut(Rect.Left+20,Rect.Top,Column.Field.DisplayText);
          if Data.Tasks.DataSet.FieldByName('HASCHILDS').AsString <> 'N' then
            TreeImages.Draw(Canvas,Rect.Left+1,Rect.Top+1,3,True)
          else
            TreeImages.Draw(Canvas,Rect.Left+1,Rect.Top+1,4,True);
          Canvas.Font.Color := clWindowText;
        end
      else
        begin
          Canvas.Brush.Assign(OldBrush);
          Canvas.Pen.Assign(OldPen);
          DefaultDrawColumnCell(Rect, DataCol, Column, State);
        end;
      end;
  Canvas.Brush.Assign(OldBrush);
  Canvas.Pen.Assign(OldPen);
  OldBrush.Free;
  OldPen.Free;
end;
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Code: Alles auswählen

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  memowidth = 10; // 10 Zeichen
var
  s: string
begin
  with (Sender as TDBGrid) do begin
    if Column.Field.IsBlob then begin
      Canvas.FillRect(Rect);
      s := copy(Column.Field.AsString, 1, memowidth);
      Canvas.TextOut(Rect.Left+2, Rect.Top+2, s);
    end else begin
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;
  end;
end;

Antworten