Newsgroup: it.comp.lang.delphi
Titolo: stringgrid con differenti stili di testo nella stessa casella

ho una stringgrid, voglio che all'interno della cella[1,1]compaia una parola con due stili differenti.
quello che voglio ottenere è questo
 
'lambda( però scritto con il simbolo greco) - deformazione'
 
quindi dovrei avere la prima parte del testo son font symbol e la seconda con font arial.....
tutto nella stessa casella
 
 

 ho una stringgrid, voglio che all'interno della cella[1,1]compaia una parola con due stili differenti. [...]
 
La *TStringGrid* non ti consente di farlo in modo automatico: devi farti carico tu di scrivere il testo nella cella, secondo le modalità personalizzate che preferisci, utilizzando i metodi dell'oggetto "Canvas", in breve ricorrendo al cosiddetto "owner drawing".
 
Prova a leggere qui per ulteriori informazioni:
http://delphi.about.com/od/vclusing/a/owner-drawing-delphi-string-grid.htm
 
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI (Software and Web Developer)
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.com
 
#Podcast: 
http://www.delphipodcast.com
 


ciao.
 
Non c'e' modo di farlo modificando delle proprieta': devi farlo tu a mano.
La StringGrid ha un evento OnDrawCell che puoi usare per disegnare 
direttamente sul Canvas della griglia. 
 
Qualcosa del genere:
 
// non compilato o testato
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: Rect; State: TGridDrawState);
var
  testo: string;
  sg : TStringGrid;
  LRect: TRect;
begin
  sg := TStringGrid(Sender);
  testo := sg.Cells[ACol, ARow]; 
  sg.Canvas.FillRect(Rect); 
 
 
sg.Canvas.Font.Name
 := 'Symbol';
  sg.Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, testo[1]);
 
sg.Canvas.Font.Name
 := 
sg.Font.Name
;
  sg.Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, copy(testo, 2, maxint);
end;
 
 
ciao
Giacomo
 

oltre a volere caratteri di differenti stili, per quella cella voglio anche il testo CENTRATO e SU DUE RIGHE quindi uso il seguente codice
 
procedure TForm1.grigliaDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  s: string;
  DrawRect: TRect;
  Grid: TStringGrid;
begin
  Grid := TstringGrid(Sender);
  S:= Grid.Cells[ACol, ARow];
//setta caratteri per l'intestazione delle colonne
  If (Length(S) > 0) and (Arow=0) then
  begin
   Griglia.Canvas.Font.Name:='Symbol';
   Griglia.Canvas.Font.Color := clBlue;
   Griglia.Canvas.Font.Style :=[fsbold];
   DrawRect := Rect;
   DrawText(Grid.Canvas.Handle, Pchar(S), Length(S), DrawRect,DT_CALCRECT or DT_CENTER);
   if (DrawRect.Bottom - DrawRect.Top) > Grid.RowHeights[ARow] then
     Grid.RowHeights[ARow] := (DrawRect.Bottom - DrawRect.Top)
   else
   begin
      DrawRect.Right := Rect.Right;
      Grid.Canvas.FillRect(DrawRect);
      DrawText(Grid.Canvas.Handle, Pchar(S), Length(S), DrawRect,DT_CENTER);
   end;
  end;
end;
end.
 
il fatto che così facendo tutto il testo è in formato symbol...... quindi??? come fare???
grazie

 il fatto che così facendo tutto il testo è in formato symbol...... quindi??? come fare???
 
Forse è troppo banale come risposta, ma quando hai scritto il testo con il primo font "Symbol", imposta il secondo font e scrivi il resto del testo.



magari funzionasse....così trovo scritto tutto con il font impostato per secondo
 

 magari funzionasse....così trovo scritto tutto con il font impostato per secondo
 
Quando chiami la DrawText(), usi il font attivo in quel momento, quindi tu devi fare
 
 
Canvas.Font.Name
 := 'Symbol';
  Canvas.DrawText(...);
 
Canvas.Font.Name
 := 'Arial';
  Canvas.DrawText(...);


in via di principio hai ragione ma io, per avere il testo centrato e su due righe lo devo scrivere in una volta sola.. come faccio a chiamare due volte il drawtext?
per farvi capire posto il codice
grazie
 
procedure TForm1.FormCreate(Sender: TObject);
begin
   Griglia.Canvas.Font.Name:='Symbol';
    griglia.Cells[1,0]:='C'+#13;
    Griglia.Canvas.Font.Name:='arial';
     griglia.Cells[1,0]:=griglia.Cells[1,0]+'[W/mK]';
end;
 
procedure TForm1.grigliaDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  s: string;
  DrawRect: TRect;
  Grid: TStringGrid;
begin
  Grid := TstringGrid(Sender);
  S:= Grid.Cells[ACol, ARow];
//setta caratteri per l'intestazione delle colonne
  If (Length(S) > 0) and (Arow=0) then
  begin
//   Griglia.Canvas.Font.Name:='arial';
   Griglia.Canvas.Font.Color := clBlue;
   Griglia.Canvas.Font.Style :=[fsbold];
   DrawRect := Rect;
   DrawText(Grid.Canvas.Handle, Pchar(S), Length(S), DrawRect,DT_CALCRECT or DT_CENTER);
   if (DrawRect.Bottom - DrawRect.Top) > Grid.RowHeights[ARow] then
     Grid.RowHeights[ARow] := (DrawRect.Bottom - DrawRect.Top)
   else
   begin
      DrawRect.Right := Rect.Right;
      Grid.Canvas.FillRect(DrawRect);
      DrawText(Grid.Canvas.Handle, Pchar(S), Length(S), DrawRect,DT_CENTER);
   end;
  end;
end;
end.
 
 
 


   Rect: TRect; State: TGridDrawState);
 
In questo evento manca totalmente l'impostazione del primo e secondo font in tempi diversi per andare a scrivere il testo.
