Un saluto a tutto il forum. Qualcuno è risucito ad installare powerpdf su Mac Os X?
Io sto provandoci su Mac Ox X 10.7 Lion, con Lazarus 0.9.28.2, ma non riesco a venirne ancora a capo.
Se installo la versione che uso correntemente per Linux e Windows, la 0.9.1, compilo correttamente il package ed eseguo il rebuild di lazarus senza problemi. Quando vado però a compilare il mio progetto che usa powerpdf ottengo il seguente errore nel modulo PdfTypes.pas:
procedure _WriteString(const Value: String; Astream: TStream);
begin
AStream.Write(Pchar(Value)^, Length(Value));
end;
Error: Illegal type conversion: "ShortString" to "^Char"
Ho provato allora a disinstallare powerpdf e ad installare la versione corrente da Lazarus CCR, la 0.9.7 del 07/12/2011 scaricabile qui:
http://sourceforge.net/projects/lazarus-ccr/files/PowerPDF/
In questo caso tuttavia riesco a compilare il pacchetto LPK, ma al momento del rebuild di Lazarus ottengo questo errore, sempre nel modulo PdfTypes.pas, nelle dichiarazioni iniziali:
Error: Identifier not found "class"
Lo stesso identico problema si verifica se installo la SVN (0.9.7.1) scaricata con:
svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/powerpdf
Avevo letto che un problema sotto Mac Os X era quello di sostituire le direttive di compilazione IF(N)DEF Linux con Unix e di sostutire ZLib con PasZLib nella clausola uses, ma vedo che entrambe le cose sono già così sia nella 0.9.7 che nella 0.9.7.1
Avete qualche consiglio per risolvere il problema? Non vorrei provare con le versioni 0.9.30 o successive che hanno purtroppo fastidiosi bachi, del resto nel readme anche della SVN vedo che è stata testata con Lazarus 0.9.27 (r16875), quindi non credo che sia quello il problema.
Buona giornata a tutti,
Stefano
procedure _WriteString(const Value: String; Astream: TStream);
begin
AStream.Write(Pchar(Value)^, Length(Value));
end;
Prova a cambiare in questo modo la chiamata.
procedure _WriteString(const Value: String; Astream: TStream);
begin
AStream.Write(Value[1], Length(Value));
end;
In questo modo eviti il cast a PChar.
Sono andato a controllare il metodo di TStream
Procedure TStream.WriteAnsiString (const S : String);
Var L : Longint;
begin
L:=Length(S);
WriteBuffer (L,SizeOf(L));
WriteBuffer (Pointer(S)^,L);
end;
Non credo vada bene al tuo scopo ... visto che ti interesa scrivere solo il contenuto della stringa (insomma solo testo).
procedure _WriteString(const Value: String; Astream: TStream);
begin
AStream.Write(Pchar(Value)^, Length(Value));
end;
Quello che ti ho indicato prima andava benissimo con Delphi.
In FreePascal dovrebbe diventare una cosa simile.
procedure _WriteString(const Value: String; Astream: TStream);
begin
AStream.Write(Pointer(Value)^, Length(Value));
end;
Ciao e grazie della velocissima risposta.
La prima soluzione sembrerebbe proprio funzionare, per lo meno non da' errore in compilazione:
AStream.Write(Value[1], Length(Value));
La seconda soluzione invece da' errore:
AStream.Write(Pointer(Value)^, Length(Value));
Error: Illegal type conversion: "ShortString" to "^untyped"
Compilando seguendo la prima soluzione, mi vedo un nuovo errore nel PdfImages.pas (da quello che ho capito PdfTypes e PdfImages sono i due moduli più ostici, se riusciamo a risolvere anche questo forse riusciamo a venirne a capo).
Il primo errore è il seguente:
PdfImages.pas(1,1) Fatal: Can't find unit QGraphics used by PdfImages
Ho pensato quindi che ci fosse qualche problema a livello di direttive di compilazione, ed ho aggiunto allora davanti a tutto:
{$DEFINE UNIX}
{$DEFINE LAZ_POWERPDF}
quindi sostituito LINUX con UNIX nelle direttive di compilazione.
Ora compilando ricevo il seguente errore:
function CreatePdfImage(AImage: TGraphic; ImageClassName: string; ObjectMgr: TPdfObjectMgr=nil): TPdfImage;
var
PdfImageCreator: TPdfImageCreator;
begin
Result := nil;
{$IFDEF LAZ_POWERPDF}
PdfImageCreator := TPdfImageCreator(PdfLazFindClass(ImageClassName).Create);
{$ELSE}
PdfImageCreator := TPdfImageCreator(FindClass(ImageClassName).Create);
{$ENDIF}
Error: Identifier not found "PdfLazFindClass"
Penso anche qui che ci sia errore a livello di direttive di compilazione, ho sostituito usando sempre e solo
PdfImageCreator := TPdfImageCreator(FindClass(ImageClassName).Create);
Adesso sembra compilare, ma viene fuori un nuovo errore, sempre in PdfImages.pas:
pb[ 0 ] := acolor.red shr 8;
pb[ 1 ] := acolor.green shr 8;
pb[ 2 ] := acolor.blue shr 8;
PdfImages.pas(275,35) Error: Incompatible types: got "LongWord" expected "TByteArray"
C'è qualcosa che posso tentare cambiare per bypassare questo errore?
Ancora grazie per l'aiuto, ciao,
Stefano
pb[ 0 ] := acolor.red shr 8;
pb[ 1 ] := acolor.green shr 8;
pb[ 2 ] := acolor.blue shr 8;
PdfImages.pas(275,35) Error: Incompatible types: got "LongWord" expected "TByteArray"
{$ifndef fpc}
for y := 0 to Height - 1 do
begin
pb := ScanLine[y];
x := 0;
while x < Width * PIXEL_COLOR_SIZE - 1 do
begin
b := pb[x];
pb[x] := pb[x+2];
pb[x+2] := b;
Stream.Write(pb[x], 3);
x := x + PIXEL_COLOR_SIZE;
end;
{$else}
for y := 0 to aintfimage.Height - 1 do
begin
new(pb);
for x := 0 to aintfimage.Width-1 do
begin
aColor := aIntfImage.Colors[x,y];
pb[ 0 ] := acolor.red shr 8;
pb[ 1 ] := acolor.green shr 8;
pb[ 2 ] := acolor.blue shr 8;
Stream.write(pb[ 0 ], 3);
end;
dispose(pb);
{$endif}
Attributes.AddItem('ColorSpace', TPdfName.CreateName('DeviceRGB'));
prova a cambiare il codice con p^[xxx]
Dall'errore di compilazione che riporti, il compilatore sta ancora puntando all'intero array.
Come in C/C++ se piazzi un puntatore a tipo e poi accedi come array, stai chiedendo al compilatore di accedere alla memoria (n*Size<T>) rispetto al puntatore.
Prova a derefenziare.
Ancora grazie dell'aiuto, sempre preciso e... risolutivo! ;)
Ho aggiunto il ^ e adesso non da' più errore:
pb^[ 0 ] := acolor.red shr 8;
pb^[ 1 ] := acolor.green shr 8;
pb^[ 2 ] := acolor.blue shr 8;
Se può servire anche ad altri, riporto anche gli errori successivi che dovrei essere riuscito a sistemare. In gran parte si tratta di errori nelle direttive di compilazione.
1) Altro errore in fondo al modulo PdfImages:
initialization
{$IFDEF LAZ_POWERPDF}
PdfLazRegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
{$ELSE}
RegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
{$ENDIF}
Identifier not found "PdfLazRegisterClassAlias"
Ho cambiato allora l'IFDEF con IFNDEF in modo che utilizzasse l'altra procedura e funziona.
initialization
{$IFNDEF LAZ_POWERPDF}
PdfLazRegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
{$ELSE}
RegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
{$ENDIF}
2) Errore in PReport:
PReport.pas(352,50) Error: Identifier not found "TMessage"
che ho risolto semplicemente aggiungendo una direttiva di compilazione all'inizio:
3) Altro problema in PRAnnotation:
PRAnnotation(1,1) Fatal: Can't find unit Windows used by PRAnnotation
risolto anche qui aggiungendo la direttiva di compilazione:
4) Problema si sposta al modulo PdfJpegImage.pas:
PdfJpegImage.pas(1,1) Fatal: Can't find unit JPEG used by PdfJpegImage
risolto con la solita direttiva di complazione:
5) Altro errore sempre in PdfJpegImage:
PdfJpegImage.pas(79,27) Error: Identifier not found "PdfLazRegisterClassAlias"
risolto cambiando l'IFDEF con IFNDEF:
initialization
{$IFNDEF LAZ_POWERPDF}
PdfLazRegisterClassAlias(TPdfJpegImage, 'Pdf-Jpeg');
{$ELSE}
RegisterClassAlias(TPdfJpegImage, 'Pdf-Jpeg');
{$ENDIF}
6) Ancora un errore in PdfJpegImage:
PdfJpegImage.pas(1,1) Fatal: Can't find unit Windows used by PRJpegImage
Tra l'altro la unit Windows non è neppure nominata in PRJpegImage (provato anche con il Cerca dell'IDE), penso quindi che si tratti di qualche altro modulo richiamato nella uses, presumo sempre a causa di direttive di compilazione errate da qualche parte.
Ho aggiunto quindi le direttive di compilazione:
{$DEFINE UNIX}
{$SEFINE LAZ_POWERPDF}
nei moduli finora reincontrati ed anche in PRJpegImage.pas
Al momento non ho incontrato altri errori di compilazione, anche se aspetto a scrivere "Risolto" di potere verificare il funzionamento di PowerPdf sotto Mac Os X.
Adesso vado a continuare il mio lavoro su altri errori in sede di compilazione del progetto, che però riguardano più in generale l'installazione di Lazarus e non powerpdf.
Ancora un grandissimo GRAZIE per l'aiuto, a buon rendere ... ;)
Buona giornata a tutti,
Stefano
Ancora un grande grazie per l'aiuto,
Stefano
Il punto 5 è errato.
PdfLazRegisterClassAlias è definito in PdfTypes.
{$IFDEF LAZ_POWERPDF}
procedure PdfLazRegisterClassAlias(aClass: TPersistentClass; Alias: string);
begin
Classes.RegisterClass(aClass);
if AliasList=nil then
AliasList := TStringList.Create;
AliasList.AddObject(Alias, TObject(aClass));
end;
Scusa la domanda, ma quando compili, hai messo come direttiva di compilazione (da IDE, per intenderci) LAZ_POWERPDF?
Non è che i problemi che incontri siano dovuto a quello? (Mi sembra che tu stia mettendo mano a tutta la libreria con modifiche ... "al volo").
Hai ragione, nella fretta si vede che ho sbagliato qualcosa.
Ho rimesso il codice originario:
initialization
{$IFDEF LAZ_POWERPDF}
PdfLazRegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
{$ELSE}
RegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
{$ENDIF}
senza problemi.
Tutti i moduli che mi hanno dato errore hanno la direttiva di compilazione:
{$DEFINE LAZ_POWERPDF}
{$DEFINE UNIX}
Adesso sono fermo sulla GTKWSArrow:
http://www.lazaruspascal.it/index.php?topic=292.0
ma questo non c'entra con PowerPdf.
Ancora grazie per l'aiuto,
Stefano
Adesso sono appena riuscito a sistemare i problemi con le UIB (che mi impedivano di testare PowerPdf) e ho provato a lanciare una stampa.
Purtroppo non riesco ancora a generare PDF.
Quando lancio una stampa, ottengo l'errore:
Error reading PReport1.Author: Access violation
Press OK to ignore and risk data corruption.
Press Cancel to kill the program
Grazie per qualsiasi consiglio.
Buona serata a tutti,
Stefano
Dal forum inglese ancora nessuna risposta, ma finalmente sono riuscito a risolvere.
Il problema dell'installazione della versione scaricata da Lazarus CCR (0.9.7) o della SVN era dovuto alla mancanza del path del componente nella configurazione di Lazarus/FPC.
In pratica, dopo avere disinstallato la versione che avevo di PowerPdf ed avere fatto il rebuild di Lazarus, quindi essere uscito da Lazurus:
1) Ho editato il file /private/etc/fpc.cfg ed ho aggiunto la seguente riga:
-Fu/Developer/lazarus/components/powerpdf
Purtroppo sotto Mac Os X occorre indicare tutti i path nel fpc.cfg o nelle opzioni del compilatore, lì è stato un mio errore, nella fretta mi era sfuggio di aggiungere il path al powerpdf scaricato dal CCR di Lazarus.
2) Ho aggiunto le direttive di compilazione all'inizio di tutti i moduli .pas di PowerPdf:
{$DEFINE UNIX}
{$DEFINE LAZ_POWERPDF}
3) Ho avviato Lazarus, ho compilato e poi installato PowerPdf e fatto il rebuild di Lazarus;
4) Al momento di compilare il mio progetto, non ottenevo più errore in PdfTypes, ma solamente in PdfImages, in cui occorre ancora aggiungere il carattere ^ come mi hai suggerito, quindi il codice:
pb [0]: = acolor.red shr 8;
pb [1]: = acolor.green shr 8;
pb [2]: = acolor.blue shr 8;
diventa:
pb^[0]: = acolor.red shr 8;
pb^[1]: = acolor.green shr 8;
pb^[2]: = acolor.blue shr 8;
A questo punto PowerPdf funziona correttamente.
Spero che questo possa servire anche ad altri che incontrano lo stesso problema. Credo che la stessa cosa possa funzionare anche con la svn, ma non ho provato (preferisco sempre utilizzare le versioni stabili).
Un grande grazie ancora a Stilgar, alla fine il tuo suggerimento di aggiungere il carattere ^ si è rivelato decisivo e mi ha permesso di venire a capo del problema.
Buona giornata a tutti e grazie a xinyiman per questo eccellente forum!!
Stefano