Newsgroup: it.comp.lang.delphi
Titolo: modificare style in una stringa ... al volo

qualcuno sa consigliarmi qualche semplice componente e/o qualche
piccola routine
mi serve semplicemente per:
showmessage('provare [b]NON[/b] costa nulla');
stringgrid1.text[1,1] := 'provare [b]NON[/b] costa nulla';
insomma mi basterebba anche il semplice BOLD
grazie

 mi serve semplicemente per:



http://www.tmssoftware.com/
http://sourceforge.net/projects/tporpheus/
http://www.delphi-jedi.org/
Sicuramente in questi miriade di componenti - sia free che a pagamento -
trovi qualcosa che fa per te
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Meglio ridurre tutti i componenti di terzi con licenze strane a volte !
Aggiungi un FRAME e ti metti il testo e i bottoni che vuoi tu.
--- posted by geoForum on 
http://www.delphiedintorni.it

azz ... in che senso aggiungere un frame ?
(poco più di un mese che uso Delphi)
dici di inserire una serie di "label" ecc. in modo da avere lo stesso 
risulltato ?
in effetti è quello che ho fatto, ma se devo aggiornare il README devo 
spostare tutte le "label" e non è certo il massimo della comodità ;)

Semplicemente vai in FILE, NEW e aggiungi il FRAME..
Vedi help per il suo utilizzo 
Puoi creare la funzione 
function MioMessaggio : booolean;
begin
// Attivi il frame
// Metti i bottoni che desideri OK, YES, NO
// Fai un result sulla base del bottone premuto
end;
I componenti dei messaggi funzionano molto bene, però c'è sempre la stessa
menata di installarli, verificare le licenze e poi se un domani voglio
fare delle modifiche al programma tenrli con le sorgenti, reinstallare e
magari ricordarmi di problemi vari...
Non dico che non vadano usati, ma è in ogni caso sempre meglio ridurli.
Etc.
Ciao


Scusa mi ricordavo male avevo scritto al volo !
Vai in File, New, Other
ti si apre una finestrina,
vai in Dialog e metti STANDARD DIALOG HORIZZONTAL
Li si può creare un messaggio ad Hoc.
Sorry mi ero confuso.
Ciao :-)


SE POCO PIU' DI UN MESE FAI COSI'....
vai in FILE in alto a sinistra e poi in NEW. Qui aggiungi una nuova FORM..
Sul codice appena dopo la scritta implementation scrivi uses Unit2; come
mostrato sotto !
implementation
uses Unit2;
A questo punto disegni la form, ti conviene mettere in border style la
proprietà dialog (la trovi nel pannellino di controllo della form2 che si
chiama object inspector).
Poi agisci sulle proprietà height e width per definirne le dimensioni.
e metti dentro un testo e i bottoni che vuoi.
Supponi di avere due bottoni OK e CANCEL
procedure TForm2.OKClick(Sender: TObject);
begin
Form2.TAG:=1;
end;
procedure TForm2.CANCELClick(Sender: TObject);
begin
Form2.TAG:=2;
end;
bene, torniamo alla Form1 cioè al nostro programma principale:
Function TForm1.MioMessaggio(Testo : String) : boolean;
begin
Form2.Show;
Form2.label1.caption:=TESTO; // qui in realtà metti tutto quello che vuoi 
                             // come componenti o canvas per la grafica 
                             // del testo 
Result:=false;
if Form2.TAG=1 then Result:=true;
Form2.TAG:=0;
Form2.Hide;    // toglie la Form di dialogo.
end;
Ciao !


Ah dimenticavo....
Per il problema del centraggio del testo e di width della form di dialogo,
basati su Length(testo)
ad esempio istruzioni del tipo:
Form2.Width:=100+20*length(TESTO); etc.
cosě ottieni i ridimensionamenti automatici etc.
Spero di esser stato utile, č piů semplice di quello che sembra.
CIAO !


a parte ringraziarti (fosse solo per il tempo speso ad aiutarmi),
non mi è chiaro:
______________________________________________________________
Form2.label1.caption:=TESTO; // qui in realtà metti tutto quello che 
vuoi
                             // come componenti o canvas per la 
grafica
                             // del testo
______________________________________________________________
probabilmente faccio prima a fare qualche prova ... ma non è 
controproducente, dal punto di vista anche delle dimensioni del 
file.EXE, fare un nuovo form per delle semplici label ?
anche facendo come dici non vedo possibilità di "mixare" differenti 
stili di font (tranne usare qualche component).
forse faccio prima a spiegarmi meglio:
ho una form in cui ho inserito l'help (probabilmente in seguito 
migrerò su qualcosa di più indicato ... ma al momento sono "ingnorante 
in materia" e parto dalle cose semplici)
ho iniziato con un semplice form sul quale ho inserito circa una 30ina 
di label singole ...
    - con questo sistema non avevo problemi nel porre i capoversi in 
BOLD ed i testo semplice in ITALIC e/o normale a seconda delle 
necessità.
dopo un po ho optato per una StringGrid in quanto mi permetteva (in 
base alle mie conoscenze) di editare più facilmente il testo senza 
dover spostare le varie Label inserendo quelle nuove ed editandole a 
seconda dei casi. Quindi facendo in pratica così:
_______________________________________________________________
unit Unit4;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
Forms,
  Dialogs, ExtCtrls, StdCtrls, Grids;
type
  TForm4 = class(TForm)
    version: TStringGrid;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.FormShow(Sender: TObject);
var i: integer;
begin
i := 0;
version.Cells[0,i]:='testo testo testo';i := i+1;
version.Cells[0,i]:='testo testo testo';i := i+1;
version.Cells[0,i]:='testo testo testo';i := i+1;
version.Cells[0,i]:='testo testo testo';i := i+1;
ecc.ecc.
_______________________________________________________________
ovviamente (spero di sbagliami) così non è possibile indicare quali 
ROW mettere in BOLD e quali in ITALIC
stesso discorso, anche se in questo caso cambia la procedura, riguarda 
gli eventuali ShowMessage ... ma in questo caso, a parte qualche 
component, pazienza ...

Ti posto questa che si basa sulla proprietà Canvas che va sempre bene per
a grafica. La puoi usare anche nelle griglie nell'evento ondrawcell.
Al posto di una Form usa altre cose se vuoi, del tipo Dialog with help etc.
Non mi sembra il caso di stare a guardare qualche K in più della
dimensione dell'exe anche se effettiavente l'uso di una Form non è corretto !
PROVA QUANTO SOTTO:
procedure TForm1.ScriviStringa(testo : string; H,V : integer);
var R,X : integer;
begin
R:=0;    Form1.Canvas.Font.Name:='Courier New';
for x:=1 to length(testo) do
begin
if testo[x]='@' then Form1.Canvas.Font.Style:=[fsBold];
if testo[x]='§' then Form1.Canvas.Font.Style:=[];
if testo[x]='°' then Form1.Canvas.Font.Color:=clRed;
if testo[x]='ç' then Form1.Canvas.Font.Color:=clBlack;
if (testo[x]<>'@')and(testo[x]<>'§')and(testo[x]<>'°')and
(testo[x]<>'ç')then begin
R:=R+1;
Form1.Canvas.TextOut(H+8*R,V,testo[X]);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Rect : TRect;
begin
ScriviStringa('Ciao @come§ stai °?ç ciao',20,20);
end;


PS. Canvas si può usare in moltissimi componenti,
Es. al posto di Form1.Canvas potesrti mettere StringGrid1.Canvas etc.
Disegna o scrive sul componente dove la usi !
Ciao


ROW mettere in BOLD e quali in ITALIC
Non č corretto :
Esempio:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
// Colora di Rosso le nuove immissioni
StringGrid1.Canvas.Font.Color:=clRed;
// Colonna 1 - colore Bianco
if (ACol=1)and(ARow>0) then 
begin
StringGrid1.Canvas.Brush.Color := clWhite;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+1,StringGrid1.Cells[ACol,ARow]);
end;
if (ACol=2)and(ARow=2) then begin
StringGrid1.Canvas.Brush.Color := clRed;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+1,StringGrid1.Cells[ACol,ARow]);
end;
etc. etc.
CMQ forse posti troppo di fretta, non si capisce l'architettuta di quello
che stai facendo.
Perň mi sembra che la tecnica che stai usando non č idonea.
Ciao.


Con canvas cambi tutti gli stili, tipi di carattere, colori etc. etc.
