Kann LCLIntf nicht finden

Rund um die LCL und andere Komponenten
USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Kann LCLIntf nicht finden

Beitrag von USchoch »

Hallo

Ich habe einige Komponenten-Units geschrieben. Wenn ich diese in einem Testprogramm verwende, mit "uses", die Kompnenten mit Cerate erstelle, funktioniert das einwandfrei.
Wenn ich jedoch die gleichen Units zu einem Package zusammenfügen will, kommt beim Compilieren des Packages die Fehlermeldung:

"Kann LCLIntf nicht finden verwendet von Meter120, incompatible ppu=C:<Lazarus\lcl\Units\x86_64-win64\lclintf.ppu, Package LCLBase"

(Meter120 ist die Unit meiner Komponente) Im Kopf der Unit steht:

unit Meter120;

{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}

(************** Messinstrument mit 120-Grad-Skala ********************)
interface

uses
{$IFnDEF FPC}
Windows,
{$ELSE}
LCLIntf, LCLType, LMessages,
{$ENDIF}
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Windows;[/size]

Warum lässt sich diese Unit als Teil eines Packages nicht compilieren, als Teil eines Projekts schon?

Wäre dankbar für Lösungsvorschläge
Gruss
Uli

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Kann LCLIntf nicht finden

Beitrag von theo »

Musst halt im Package die Anforderung LCL hinzufügen.
Siehe "Benötigte Packages" im Bild.
Dateianhänge
lazpack.png

USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Re: Kann LCLIntf nicht finden

Beitrag von USchoch »

Salü Theo
Danke schon mal für den Hinweis
Bei meinem Package steht dort, wo in deinem Bild LCL steht, FCL drin. Woher nehme ich das LCL? Und das FCL muss dann vermutlich gelöscht werden?

Im Voraus danke und Gruss
Uli

USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Re: Kann LCLIntf nicht finden

Beitrag von USchoch »

Nochmals salü Theo
Das mit der Anforderung anfügen habe ich geschafft. Das Compilieren des Packages funktioniert jetzt. Nun wollte ich bei "Nutzung" "installieren" anklicken. Da kommt aber dei Meldung:
"Das Package MeineKomponenten hat kein Registerprocedur"

Im File MeineKomponenten.pas steht folgendes:
-----------------------------------------
implementation

procedure Register;
begin
end;

initialization
RegisterPackage('MeineKomponenten', @Register);
end.
---------------------------------------
Die Procedur "Register" gibt's wohl, sie ist aber leer. Und dieses File wurde automatsch generiert, man soll nichts ändern.
Jede Unit meiner Komponenten hat jeweils eine Registerprocedur, so:

----------------------
procedure Register;
begin
RegisterComponents('Beispiele', [TMeter120]);
end;
-------------------------

Vile fehlt wohl nicht mehr, wie weiter?

Gruss
Uli

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Kann LCLIntf nicht finden

Beitrag von wp_xyz »

Bei allen Units der Komponente, die eine von dir geschriebene Register-Prozedur haben, musst du im Package-Editor das Häkchen vor "Dateieigenschaften: Registriere Unit" setzen. Schau dir vielleicht das einfache Package lazmrumenu an (im Ordner: Lazarus/Components/mrumenu). Hier ist die Komponenten in der Unit mrumanager.pp implementiert. Für die Registrierung gibt es eine separate Unit reglazmru, die die Register-Prozedur enthält. Diese Unit hat im Package-Editor das Häkchen vor "Registriere Unit" gesetzt. Du könntest die Register-Prozedur auch in der Komponenten-Unit (hier: mrumanager) unterbrigen, aber eine zentrale Registrierungsunit macht die Sache übersichtlicher, wenn mehrere Komponenten zu registrieren sind. Auch ist dies ein Schritt Laufzeit- und Design-Code getrennt zu halten.

Schau dir mal http://wiki.freepascal.org/How_To_Write ... _Component an. Hier findest du auch die Antwort auf die nächste Frage, wie man das mit dem Komponenten-Icon hinkriegt.

USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Re: Kann LCLIntf nicht finden

Beitrag von USchoch »

Salü wp_xyz

Meine nächste Frage hast du gut vorausgesehen. Ich habe für jede Komponente ein .PNG 24x24 gemacht. Mit dem GLazres habe ich mit Bilder einfügen eine Datei "Meinekomponenten.lrs gemacht mit allen Bilchen drin. Die Datei ist dort, wo die .pas .png sind. in den .pas-Daeien meiner Komponenten-Units habe ich

{$R Meinekomponenten.lrs }

reingeschrieben. Das macht aber einen Fehler beim Compilieren der Package.

"Error while compiling resources -> compile with -vd for more Details Check for Duplicates."

Muss ich für jede Komponente eine eigene .lsr machen mit dem Bildchen dieser Kompnente drin?
Und wie compiliert man mit -vd?

Im voraus danke für deine Antwort und Gruss
Uli

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Kann LCLIntf nicht finden

Beitrag von wp_xyz »

Dieselbe Resource-Datei darf nur 1x aufgeführt sein, sie steht in der Unit, in der die Komponente registriert wird - wichtig, falls die lsr-Datei mehrere Bilder enthält. Ein möglicher Fehler wäre auch noch: lrs-Dateien müssen im Initialization-Abschnitt per {$I <resourcename>.lrs} eingebunden werden. Du kannst auch die mit Delphi-kompatiblen .res-Dateien verwenden; diese werden dann aber per {$R <resourcename>.res} üblicherweise hinter "implementation" eingebunden.

Schau dir einfach ein paar Beispiele aus lazarus/components an.

USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Re: Kann LCLIntf nicht finden

Beitrag von USchoch »

Salü

Ich komme nicht weiter. Ich habe die Datei sdposerial.pas als Beispiel angeschaut, das ist ein Komponente für die Serieschnittstelle. Dort steht am Ende der Unit:


procedure Register;
begin
RegisterComponents('5dpo', [TSdpoSerial]);
end;

initialization
{$i TSdpoSerial.lrs}

end.


Wenn ich diesen Code am Ende meiner Komponenten-Unit (eine Uhr mit Zifferblatt und Zeigern) anfüge, heisst das so:

procedure Register;
begin
RegisterComponents('Beispiele', [TUhr]);
end;

initialization
{$i TUhr.lrs}

end.


In TUhr.lrs habe ich das mit glazres eingebundene Icon der Uhr drin. Wenn ich nun das Package compiliere, kommt eine Fehlermeldung "Identifier not found...", die TUhr.lrs wird im Quelltexteditor angezeigt, so:

LazarusResources.Add('TUhr','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#10'OiCCPPhotoshop ICC pr'

etc.

Dass der Compiler mit dessen Inhalt nichts anfangen kann, scheint klar zu sein. Was läuft da falsch? Übrigens: Ich arbeite mit Windows 10.

Hast du noch eine Lösungsidee?

Gruss Uli

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

Re: Kann LCLIntf nicht finden

Beitrag von Mathias »

@USchoch

Könntest du bitte in Zukunft die Code Tag verwenden, dann wird dein Code leserlicher. :wink:

Dazu einfach die ComboBox mit dem Wort "Highlighter" öffnen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Kann LCLIntf nicht finden

Beitrag von wp_xyz »

USchoch hat geschrieben:Hast du noch eine Lösungsidee?

Die Komponentendateien in ein zip packen und hier hochladen.

USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Re: Kann LCLIntf nicht finden

Beitrag von USchoch »

Salü wp_xyz

In der ZIP-Datei sind die Komponenten, die Icons, ein Testprogramm, das die Komponenten per .Create erzeugt und die Package. In den .pas habe ich die {R ...lsr} auskommentiert, damit du das Testprgramm compilieren kannst.

Hoffentlich klappt es und Gruss
Uli
Dateianhänge
MeineKomponenten.zip
(12.38 MiB) 48-mal heruntergeladen

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Kann LCLIntf nicht finden

Beitrag von wp_xyz »

Da hast du meinen Sermon oben offenbar nur überflogen: "Ein möglicher Fehler wäre auch noch: lrs-Dateien müssen im Initialization-Abschnitt per {$I <resourcename>.lrs} eingebunden werden. " - du hast sie aber als "{$R <resourcename>.lrs}" hinter implemenation. Das passt nicht zusammen: Mit {$R kannst du nur .res-Dateien einbinden. Also: du müsstest die png-Bilder in eine res-Resource packen (das geht z.B. mit dem kostenlosen XNResourceEditor oder mit LazRes (Beispiel folgt gleich) oder wahrscheinlich auch mit glazres), oder du verschiebst die {$R...} Zeile ans Ende der Unit in den "initialization"-Abschnitt (der üblicherweise fehlt - d.h. du müsstest noch "initialization" hinschreiben) und ersetzt das {$R durch ein {$I. Damit die lrs-Dateien funktionen, muss noch die Unit LResources in uses aufgenommen werden.

Hier noch das versprochene Beispiel eines Scripts für LazRes:

Code: Alles auswählen

c:\lazarus\tools\lazres TMassstab.res TMassstab.png
c:\lazarus\tools\lazres TWindrose.res TWindrose.png
 
:: oder alles in einer einzigen res-Datei -- diese darf aber nur 1x mit {$R eingebunden werden !
c:\lazres\tools\lazarus MeineKomponenten.res TMassstab.png TWindrose.png
 
:: Die Bilddateinamen können auch in einer Datei stehen (z.B. "BilderListe.txt"), die mit @dateiname aufgerufen wird
:: c:\lazres\tools\lazarus MeineKomponenten.res @BilderListe.txt
 


P.S.
Sehr schöne Komponenten übrigens!

USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Re: Kann LCLIntf nicht finden

Beitrag von USchoch »

Hallo
Ich habe jetzt mit lazres die .res-Datenen erstellt. Das hat geklappt. Das Programm TestMeineKomp lässt sich fehlerfrei compilieren und läuft. Auch das Package MeineKomponenten wird fehlerfrei compiliert. Wenn ich nun im Fenster Package Meinekomponenten auf Nutzung klicke, dort installieren wähle, kommt die Frage, ob ich Lazarus neu kompilieren wolle. Da sage ich ja, es wird compiliert und Lazarus neu gestartet. Meine Komponenten erscheinen aber nicht in der Palette im Reiter Beispiele. Da scheint noch ein kleines Schrittchen zu fehlen. Welches?

übrigen danke für die "schönen Komponenten", ich brauche sie u. a. für einen Windmesser. Den Massstab kann man für Diagramme brauch, horizontale und vertikale Achsen.

Gruss
Uli

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Kann LCLIntf nicht finden

Beitrag von wp_xyz »

Bei mir waren sie da...

Wenn du die Package-Datei mit dem Package-Editor öffnest, muss unter Einstellungen / Package-Einstellungen / IDE-Integration die Option Package-Typ Entwicklungs- und Laufzeit gewählt sein. Alles andere lässt du unverändert, bis evtl.auf Package-Einstellungen / Beschreibung: Hier kannst du eine Kurzbeschreibung eintragen, so dass man eher versteht, wofür dieses Package gut ist: Wenn man es unter Package / Installierte Packages einrichten in die IDE installieren möchte, erscheint dieser Text zu dem Package unten im Formular; ansonsten müsste mit dem oft kryptischen Packagenamen vorlieb nehmen. Ist aber bei einem eigenen Package nicht unbedingt nötig.

Die Neukompilierung der IDE ist bei einem solchen Design-/Laufzeit-Package normal. Anders als bei Delphi werden Packages direkt statisch in die IDE integriert, nicht dynamisch eingebunden. Daher die Warnung: Ein fehlerhaftes Package kann zu einer nicht mehr verwendbaren IDE führen! Für diesen Fall wird beim Kompilieren der IDE die alte IDE als lazarus.old.exe gesichert. Dann also: lazarus.exe löschen und lazarus.old.exe in lazarus.exe umbenennen, und alles funktioniert wieder (nur halt ohne deine Komponenten). Um es gar nicht so weit kommen zu lassen, musst du unbedingt die im Package enthaltenen Komponenten gut testen: Schreibe Test-Programme, in denen die Komponenten dynamische zur Laufzeit erstellt werden, verändere alle Properties, und prüfe, ob sich alles richtig verhält. Erst wenn alles funktioniert, solltest du dich an die Installation wagen. Treten Fehler erst nach der Installation auf, wird's schwierig...

USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Re: Kann LCLIntf nicht finden

Beitrag von USchoch »

Salü
Schön, dass die Komponenten bei dir erscheinen, bei mir weiterhin nicht. Die Einstellung Package-Typ Entwicklungs- und Laufzeit ist korrekt. Im Packagefenster siehts auch gut aus. Das Neukompilieren der IDE funktioniert auch, auch Neustart von Lazarus wird durchgeführt. Nur die Palette "Beispiele" fehlt. In IDE-Einstellungen, Komponenten-Palette erschein sie. Da sie aber leer ist, sieht min sie bei der Palettenleiste nicht.
Irgendwie bin ich am Anschlag!

Etwas ist mir noch aufgefallen. Meine Komponentenunits aus Delphi (Mit "Werkzeuge" von Delphi in Lazarus umgewandelt) habe am Anfang der Unit folgende Einträge:

Code: Alles auswählen

unit Uhr;
 
{$IFDEF FPC}
  {$MODE Delphi}
{$ENDIF}
 
interface
 
uses
 
{$IFnDEF FPC}
  WinTypes, WinProcs,
{$ELSE}
{$IFnDEF FPC}
  Windows,
{$ELSE}
{$ENDIF}
  LCLIntf, LCLType, LMessages,
{$ENDIF}
  SysUtils, Messages, Classes, Graphics, Controls, Windows,
  Forms, Dialogs, ExtCtrls;         


In einer in Lazarus erstellten Unit steht am Anfang nur:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Uhr, Meter120, Windrose, Tline;       


Kann hier noch ein Problem begraben sein?
Ich freue mich schon auf deinen Lösungsvorschlag

Gruss
Uli

Antworten