Bin ich einen Komponente ?

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Bin ich einen Komponente ?

Beitrag von Mathias »

Ich will eine Unit/Form für eine Komponente, sowie für normale Anwendungen nutzen ?

Kann man mit einem Compilerschalter abfragen, ob es sich um eine Komponente handelt ?

Code: Alles auswählen

uses
...
  {$IFDEF Komponets}
  BaseIDEIntf,  // Bei Komponente
  LazConfigStorage,
  {$ELSE}
  IniFiles,  // Bei normalen Anwendungen
  {$ENDIF}
...



Nachtrag:
Mir ist noch die Idee gekommen, das ich IniFiles auch in der Komponente verwende.
Aber dann wird die Ini-Datei in meinen Home-Ordner gespeichert.
Aber ich will es im Config-Ornder von Lazarus haben.

Code: Alles auswählen

var
  ini:TIniFile;
begin
  ini := TIniFile.Create('testini.ini');
  ini.WriteInteger('pos', 'Left',   Left);
 ...
 
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 684
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Bin ich einen Komponente ?

Beitrag von fliegermichl »

Wenn man eine LPK Datei öffnet, gibt es doch den Button Einstellungen.
Da steht dann im Header "Einstellungen für Package meinPackage 1.0"

Unter benutzerdefinierte Einstellungen kann man -dKomponents reinschreiben.

Beim Projekt wo die Komponente dann verwendet wird macht man das nicht und schon kannst du es unterscheiden.

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bin ich einen Komponente ?

Beitrag von Mathias »

Habe ich gemacht.

Nur wie kann ich es jetzt mit {$ifxxx} auswerten ?
Dateianhänge
Bildschirmfoto vom 2020-04-14 12-58-36.png
Bildschirmfoto vom 2020-04-14 12-58-36.png (60.61 KiB) 805 mal betrachtet
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 684
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Bin ich einen Komponente ?

Beitrag von fliegermichl »

Genauso wie du es in deinem ersten Post gemacht hast. Nur das fehlende "n" muss noch dazu.

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bin ich einen Komponente ?

Beitrag von Mathias »

Danke, jetzt habe ich verstanden.

So wie ich sehe, kann man mit -dxxx ifdef Bedienungen setzten ?
Darf man mehrer -d Kommandos in den "Benutzerdefinierten Einstellungen" setzten ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1504
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Bin ich einen Komponente ?

Beitrag von Warf »

Ja.
Andere sachen die hilfreich sind, wenn du debug und release build modi benutzt dort ein -dDebug und -dRelease reinsetzten für debug code wie WriteLn's oder ähnliches, den du im release nicht haben willst

charlytango
Beiträge: 208
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Bin ich einen Komponente ?

Beitrag von charlytango »

Mathias hat geschrieben:Danke, jetzt habe ich verstanden.

So wie ich sehe, kann man mit -dxxx ifdef Bedienungen setzten ?
Darf man mehrer -d Kommandos in den "Benutzerdefinierten Einstellungen" setzten ?


Ja, kannst/darfst du.

man könnte sogar diese Einstellungen (=Defines) in eine eigene Datei packen und sie unter:
Menue: Project > Project Options... //Compiler Options > Config and Target > Use additional compiler config file
ins Projekt einbinden.
Leider klappt das nicht oder noch nicht (https://www.lazarusforum.de/viewtopic.php?f=10&t=12567)

bis dahin bleiben eigentlich nur die "Benutzerdefinierten Einstellungen" oder #include Anweisungen in allen betroffenen Sourcefiles

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bin ich einen Komponente ?

Beitrag von Mathias »

oder #include Anweisungen in allen betroffenen Sourcefiles

Genau das will ich umgehen.

Jetzt werden die Positionen eines Forms gespeichert, egal ob in einer Komponente oder einem normalen Programm. :wink:

Code: Alles auswählen

procedure LoadFormPos(Form: TForm);
var
  {$IFDEF Komponents}
  Cfg: TConfigStorage;
  {$ELSE}
  Cfg: TXMLConfig;
  {$ENDIF}
begin
  with Form do begin
    {$IFDEF Komponents}
    Cfg := GetIDEConfigStorage(Embedded_Options_File, True);
    {$ELSE}
    Cfg := TXMLConfig.Create(nil);
    Cfg.Filename := 'config.xml';
    {$ENDIF}
    Left := StrToInt(Cfg.GetValue(Name + '/Left/value', IntToStr(Left)));
    Top := StrToInt(Cfg.GetValue(Name + '/Top/value', IntToStr(Top)));
    Width := StrToInt(Cfg.GetValue(Name + '/Width/value', IntToStr(Width)));
    Height := StrToInt(Cfg.GetValue(Name + '/Height/value', IntToStr(Height)));
    Cfg.Free;
  end;
end;
 
procedure SaveFormPos(Form: TForm);
var
  {$IFDEF Komponents}
  Cfg: TConfigStorage;
  {$ELSE}
  Cfg: TXMLConfig;
  {$ENDIF}
begin
  with Form do begin
    {$IFDEF Komponents}
    Cfg := GetIDEConfigStorage(Embedded_Options_File, True);
    {$ELSE}
    Cfg := TXMLConfig.Create(nil);
    Cfg.Filename := 'config.xml';
    {$ENDIF}
    Cfg.SetDeleteValue(Name + '/Left/value', IntToStr(Left), '90');
    Cfg.SetDeleteValue(Name + '/Top/value', IntToStr(Top), '60');
    Cfg.SetDeleteValue(Name + '/Width/value', IntToStr(Width), '300');
    Cfg.SetDeleteValue(Name + '/Height/value', IntToStr(Height), '400');
    Cfg.Free;
  end;
end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bin ich einen Komponente ?

Beitrag von Mathias »

Der Code ist noch etwas einfacher geworden, man kann sich das IntToStr und StrToInt sparen.

Code: Alles auswählen

procedure LoadFormPos(Form: TControl);
var
  {$IFDEF Komponents}
  Cfg: TConfigStorage;
  {$ELSE}
  Cfg: TXMLConfig;
  {$ENDIF}
begin
  with Form do begin
    {$IFDEF Komponents}
    Cfg := GetIDEConfigStorage(Embedded_Options_File, True);
    {$ELSE}
    Cfg := TXMLConfig.Create(nil);
    Cfg.Filename := 'config.xml';
    {$ENDIF}
    Left := Cfg.GetValue(WideString(Name) + '/Left/value', Left);
    Top := Cfg.GetValue(WideString(Name) + '/Top/value', Top);
    Width := Cfg.GetValue(WideString(Name) + '/Width/value', Width);
    Height := Cfg.GetValue(WideString(Name) + '/Height/value', Height);
    Cfg.Free;
  end;
end;
 
procedure SaveFormPos(Form: TControl);
var
  {$IFDEF Komponents}
  Cfg: TConfigStorage;
  {$ELSE}
  Cfg: TXMLConfig;
  {$ENDIF}
begin
  with Form do begin
    {$IFDEF Komponents}
    Cfg := GetIDEConfigStorage(Embedded_Options_File, True);
    {$ELSE}
    Cfg := TXMLConfig.Create(nil);
    Cfg.Filename := 'config.xml';
    {$ENDIF}
    Cfg.SetValue(WideString(Name) + '/Left/value', Left);
    Cfg.SetValue(WideString(Name) + '/Top/value', Top);
    Cfg.SetValue(WideString(Name) + '/Width/value', Width);
    Cfg.SetValue(WideString(Name) + '/Height/value', Height);
    Cfg.Free;
  end;
end;   
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten