LCL erweitern

Rund um die LCL und andere Komponenten
Antworten
jus
Beiträge: 52
Registriert: Fr 6. Mai 2011, 13:29

LCL erweitern

Beitrag von jus »

Hallo,

ich bin derzeit im Anfängerstadium von Lazarus. ich verwende Lazarus unter Mac OSX und möchte die das Objekt TCarbonPrinter in "carbonprinters_h.inc" und "carbonprinters.inc" um paar Eigenschaften erweitern. Doch sobald ich die Änderungen durgeführt habe und ich das aktuelle Projekt mit Apfeltaste+R starten möchte kommt folgende Fehlermeldung:
/Developer/lazarus/components/printers/printersdlgs.pp(27,60) Fatal: Can't find unit OSPrinters used by PrintersDlgs

Ich habe unter Lazarus Werkzeuge->"Kompiliere mit Profil:Alles neu kompilieren" versucht, aber ohne Erfolg. :(

Könnte wer mir bitte einen Tipp geben, was man machen muß, wenn man generell die Sourcen von Lazarus ändern möchte?

Lg,
jus

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: LCL erweitern

Beitrag von MAC »

versuch mal nicht das objekt TCarbonPrinter zu verändern.
Das hat 2 Gründe:
1. Wenn du die Arbeit mit jemanden austauschst hat er vielleicht nicht die angepasste carbonprinters_h.inc.
2. Wenn du lazarus neu installierst (updatest ? ) könnte diese überschrieben werden.

Was ich dir eher empfehle ist eine Neue Komponente zu erstellen und diese Davon ableiten:

Einfach in irgendeine unit [ am besten eine neue )= den code einfügen

Code: Alles auswählen

TMyCarbonPrinter = class(TCarbonPrinter) 
private
   feinstring: string;
   procedure Seteinstring(const AValue: string);
public
  zusatzliche_Variable:integer;
  property einstring:string read feinstring write Seteinstring;
end;
wie das heißt ist total egal, man sollte nur am name erkennen womit es verwandt ist...
Wichtig ist, dass bei class in Klammern das eigentliche TCarbonPrinter steht.
Damit erbst du sozusagen alle EIgenschaften dieser Klasse. Das heißt alles was TCarbonPrinter kann, kann deine Neue Klasse auch. Plus das was jetzt noch in private und public steht...

Code: Alles auswählen

Signatur := nil;

jus
Beiträge: 52
Registriert: Fr 6. Mai 2011, 13:29

Re: LCL erweitern

Beitrag von jus »

Hallo MAC,

danke für die schnelle Antwort. Mein Problem ist nämlich, dass ich bestimmte aktuelle Variablen (PrintSession,PrintSettings,PageFormat) von TPrinter bzw. unter Mac die abgeleitete Klasse TCarbonprinter verändern möchte, die derzeit nur als readonly in public-Bereich von TCarbonprinter deklariert sind:

Code: Alles auswählen

TCarbonPrinter = class(TPrinter)
  private
    FPrintSettings: PMPrintSettings;
  public
    property PrintSettings: PMPrintSettings read FPrintSettings;
end;
 
//Im Hauptprogramm kann die Variable PrintSettings auslesen:
procedure TForm1.Button1Click(Sender: TObject);
var
  Result: PMPrintSettings;
begin
  Result:=TCarbonPrinter(Printer).PrintSettings;
end;
Nun möchte ich aber auch die Variable nicht nur auslesen können, sondern die Variable FPrintSettings ändern können. Meine Idee war:

Code: Alles auswählen

TCarbonPrinter = class(TPrinter)
  private
    FPrintSettings: PMPrintSettings;
   procedure SetPrintSetting(NewSetting:PMPrintSettings);
  public
    property PrintSettings: PMPrintSettings read FPrintSettings write SetPrintSetting;
end;
 
//Im Hauptprogramm kann auf die Variable PrintSettings zugreifen:
procedure TForm1.Button1Click(Sender: TObject);
var
  Result: PMPrintSettings;
begin
  Result:=Get_von_irgendwoher;
  TCarbonPrinter(Printer).PrintSettings:=Result;
end;
Ich muß aber ehrlich zugeben, dass es bei mir derzeit daran scheitert, dass ich dann, nachdem ich eine abgeleitete Klasse erstellt habe, nicht mehr weiß wie ich im Programm auf die aktuell im Printer gesetzte Variable PrintSettings mit der eigenen abgeleiteten Klasse zugreifen und verändern kann. Da meine abgeleitete Instanz ja überhaupt nichts mehr mit Printer Instanz zu tun hat. Sprich, man sieht schon, dass ich in objektorientierter Programmierung noch nicht ganz firm bin. :oops: Für Tipps wäre ich sehr dankbar.

Lg,
jus

P.S. Das wäre ja auch ein Feature, dass man unter Umständen ins Standard LCL aufnehmen könnte.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: LCL erweitern

Beitrag von MAC »

ah, ok.
Ist PrintSettings auch eine Klasse ?
Ist eigentlich egal, aber dann musst du beim Überschreiben also in der Procedure SetPrintSettings vorher noch die alte variable löschen (.Free) , da sonst ein Speicherleck entsteht (das Programm braucht jedes mal mehr Ram und mehr und mehr...).
Ich glaube auf die Eigenschaft der vorherigen Klasse solltest du einfach zugreifen können als ob es in deiner jeztigen steht.
Das heißt, wenn du die bereitz existierende variable

Code: Alles auswählen

private
    FPrintSettings: PMPrintSettings;
ändern willst. Solltest du sie in deiner neuen Klasse nicht erwähnen. Der Compiler sollte dann merken "aha, hier nicht deklariert, schau ich mal bei den Vorfahren".

Code: Alles auswählen

TCarbonPrinter = class(TPrinter)
  private // keine variable nur die property...
   procedure SetPrintSetting(NewSetting:PMPrintSettings);
  public
    property PrintSettings: PMPrintSettings read FPrintSettings write SetPrintSetting; // eventuell " override; " 
end;

Wobei ich glaube das man das aus irgendwelchen Gründen weggellassen hat (man will nicht das man dort was ändert weil , ka... )

Code: Alles auswählen

Signatur := nil;

Antworten