Potrebbe essere:
-Penso che tu non abbia fatto la uses della unit DBcontrols.
A me funziona anche col dbmemo vuoto e con il file chiuso.
-Mi sembra di capire che tu usi Zeoslib, io non lo conosco, uso i componenti standard.
Il comportamento diverso del componenete dbmemo potrebbe essere dovuto a questo.
Con l'occasione mi sono accorto che il codice di esempio che ti ho dato è incompleto. Cioè la tabella tmemdataset prima di essere azzerata con clear, deve essere chiusa ti riporto il mio codice così corretto:
if memdataset1.Active then
memdataset1.close;
memdataset1.Clear(False);
memdataset1.Open;
for i := 0 to dbmemo3.Lines.Count - 1 do
memdataset1.AppendRecord([dbmemo3.Lines[i]] );
Tito Livio, il salto pagina avviene quando il testo non entra completamente in quel che resta della pagina.
Ho tre tabelle collegate, la tabella "misure" ha mastersource "totarticoli", la tabella "Totarticoli" ha mastersource la tabella "Lotti",
quindi iniziando il ciclo da "Lotti" tutto il resto viene elaborato correttamente e la stampa è accettabile.
Ho provato ad usare le tue linee di codice ed in Lazreport e ho inserito:
1. una Master Data collegata a Totarticoli dove stampo il codice articolo
2. Una Master Data collegata collegata al MemDataset
3. una Detail Data stampa i record della descrizione ricavati da Totarti
L'aggiunta di record in MemDataset.Descrizione avviene durante l'elaborazione del Report attraverso un campo DBMemo invisibile collegato a Totarti e con il seguente codice nell' OnDataChange del DataSource di Totarti:
procedure TGescompF.DTotartiDataChange(Sender: TObject; Field: TField);
var
i:integer;
begin
if Dataprogetto.MemTotarti.Active then
Dataprogetto.MemTotarti.close;
Dataprogetto.MemTotarti.Clear(False);
Dataprogetto.MemTotarti.Open;
Dataprogetto.MemTotarti.AppendRecord([Dataprogetto.TotartiCodice.Text] );
for i := 0 to GescompF.dbmemo28.Lines.Count - 1 do
Dataprogetto.MemTotarti.AppendRecord([GescompF.dbmemo28.Lines[i]] );
end;
Mettendo un controllo sulle righe del MemDataset ho verificato che la lunghezza del testo contenuto in un record può essere anche di molte righe sul Report,naturalmente in base al width del Rettangolo che lo contiene, quindi per esempio stampa il codice e salta pagina lasciando molte righe in bianco. Dovrei provare a ricavare in MemDataset record con numero di caratteri corrispondenti alla larghezza di una riga prevista nel report che in questo caso è 320.
Grazie per l'aiuto.
Stabilire il numero di caratteri per record è una stupidaggine perchè taglia e va a capo.
Niente da fare! anche il codice seguente, da inserire in "OnEnterRect" del frReport, funziona per stampe di un solo record:
if (View is TfrMemoView) then
if (View as TfrMemoView).Name = 'Memo27' then
(View as TfrMemoView).Memo.Text := Form1.DBMemo28.Lines.Text;
Forse dovrò tornare a Fortes Report...
Tempo fa in un forum inglese avevo visto e salvato le istruzioni per scrivere un testo lungo su più pagine, avevo provato ad utilizzarla senza successo. In questi ultimi giorni ho riprovato ad utilizzarla e ci sono riuscito.
Per potere scrivere un testo lungo di un campo TEXT su più pagine:
Mettere sulla propria form un un TMemo, il nome dell'esempio Memo2, nel TDataSource della Tabella che interessa inserire il seguente codice nell'evento onDataChange
procedure TGescompF.DTotartiDataChange(Sender: TObject; Field: TField);
begin
GescompF.Memo2.Clear;
GescompF.Memo2.Text:=DataProgetto.TotartiAnnotazion.AsString;
GescompF.Memo2.Text:= StringReplace(GescompF.Memo2.Text, '[', '-', [rfReplaceAll]);
GescompF.Memo2.Text:= StringReplace(GescompF.Memo2.Text, ']', '-', [rfReplaceAll]);
end;
questa routine copia il testo contenuto nel campo TEXT della Tabella, in questo caso TotartiAnnotazion nel TMemo inserito nella Form così da consentirmi, senza modificare nulla dei dati, di eliminare le criticità per Lazreport come per esempio le parentesi quadre.
Selezionare TFrRporto, nel mio caso FrReport1 e nell'evento OnEnterRect inserire il seguente codice:
procedure TGescompF.frReport1EnterRect(Memo: TStringList; View: TfrView);
begin
if (View is TfrMemoView) then
if (View as TfrMemoView).Name = 'Memo27' then
(View as TfrMemoView).Memo.Text := GescompF.Memo2.Lines.Text;
end;
Aprire il designer di Lazreport e inserire una MasterData Band, right-click e selezionare "Stretched" & "Break"
Inserire un Rettangolo sulla MasterData Band,name Memo27, right-click e selezionare "Stretched" & "wordwrap", risultato allegato. Problema risolto.
L'elemento Memo2 deve essere visibile e per non farlo vedere si possono impostare : BorderStyle su bsNone e Font-Color su clNone.
Cosi funziona sia sotto Windows che sotto Linux.