TBitmap nicht vorhanden?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
henlambert
Beiträge: 12
Registriert: Di 7. Mai 2013, 18:32

TBitmap nicht vorhanden?

Beitrag von henlambert »

Irgendwie habe ich das Lazarus-Konzept noch nicht durchschaut. Ich benötige eine Variable vom Typ TBitmap. In einem normalen Anwendungsprogramm auf Basis der LCL kann ich die Variable an jeder Stelle problemlos einrichten. Mein Programm ist aber eine Konsolenanwendung mit OpenGL. TBitmap ist von vornherein nicht greifbar, und ich vermute, dass die Komponente mit "uses Graphics" eingebunden werden muss. Das wiederum geht nicht: "Check if package LCLBase is in the dependencies"

Welche Dependencies? Wo werden sie eingestellt?

So einiges habe ich bereits versucht, pralle aber spätestens dann zurück, wenn von Neukompilierung der IDE die Rede ist. Das kann doch nicht in Frage kommen, immerhin sind die LCL-Komponenten bereits verfügbar, sonst könnten sie in einem normalen Anwendungsprogramm doch nicht vorhanden sein. Oder, was sehe ich falsch?

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TBitmap nicht vorhanden?

Beitrag von Soner »

LCL-Komponenten kann man in reinem Konsoleprogramm nicht verwenden. Versuche mit FCL-Komponenten von Freepascal die kann man auch in Konsolenprogramme verwenden. Schau hier:
http://wiki.freepascal.org/fcl-image

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TBitmap nicht vorhanden?

Beitrag von Socke »

Soner hat geschrieben:LCL-Komponenten kann man in reinem Konsoleprogramm nicht verwenden.
Das stimmt, ist aber gar nicht gefragt.

Die Unit Graphics gehört nämlich gar nicht direkt zur LCL sondern zum Package LCLBase. Darin sind Units enthalten, die zwar hauptsächlich in der LCL (und damit in grafischen Anwendungen) Verwendung finden, aber nicht auf eine grafische Oberfläche angewiesen sind.
henlambert hat geschrieben:dass die Komponente mit "uses Graphics" eingebunden werden muss. Das wiederum geht nicht: "Check if package LCLBase is in the dependencies"

Welche Dependencies? Wo werden sie eingestellt?
Das ist richtig. Ein Projekt kann in Lazarus (wie in Delphi) von sogenannten Packages abhängig sein. Ein Package ist eine Sammlung von Units, die in häufig thematisch zusammenhängen. Wenn ein Projekt von einem Package abhängt, kann Lazarus die dort enthaltenen Units finden (ohne dass sie im Projektverzeichnis liegen müssen).

Kann man Einstellen über den Projektinspektor. Zu finden im Menü unter: Projekt -> Projektinspektor -> Hinzufügen -> Neue Anforderung -> "LCLBase" als Package-Namen eintragen und bestätigen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

henlambert
Beiträge: 12
Registriert: Di 7. Mai 2013, 18:32

Re: TBitmap nicht vorhanden?

Beitrag von henlambert »

Kann man Einstellen über den Projektinspektor. Zu finden im Menü unter: Projekt -> Projektinspektor -> Hinzufügen -> Neue Anforderung -> "LCLBase" als Package-Namen eintragen und bestätigen.
Jawoll, so geht es. Aber darauf wäre ich nie gekommen, selbst wenn ich die entsprechenden Kapitel im Lazarus-Buch ein weiteres Mal vor- und rückwärts gelesen hätte. Danke.

@Soner:
TBitmap wird tatsächlich nicht als visuelle Komponente gebraucht, sondern zur Speicherung und Auswertung von Grafiken. In meinem Fall geht es um sogenannte "Heightmaps", bei denen die Farbwerte einmalig in Höhenkoordinaten umgewandelt werden, die wiederum in einem Array gespeichert werden. Auf dem Bildschirm dargestellt wird diese Bitmap zu keiner Zeit, und wenn so etwas mit einem anderen Bild mal geschieht, ist OpenGL dafür zuständig. Jedenfalls ist es nur logisch, dass TBitmap auch in Konsolenandwendungen verwendet werden kann.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TBitmap nicht vorhanden?

Beitrag von Christian »

TBitmap ist auch keine visuelle Komponente es ist noch nichtmal ne Komponente
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: TBitmap nicht vorhanden?

Beitrag von theo »

henlambert hat geschrieben:Jedenfalls ist es nur logisch, dass TBitmap auch in Konsolenandwendungen verwendet werden kann.
Nicht unbedingt. Es geht vllt. schon, aber damit handelst du dir eine Abhängigkeit von einem Widgetset ein, die es für die Konsole eigentlich nicht bräuchte. Das TBitmap ist verwoben mit dem Widgetset und verwendet z.T. dessen Funktionen zum Zeichnen auf Canvas, Font etc..
Mit FPImage bist du frei davon.

henlambert
Beiträge: 12
Registriert: Di 7. Mai 2013, 18:32

Re: TBitmap nicht vorhanden?

Beitrag von henlambert »

Ok, die Argumente gegen TBitmap scheinen schlüssig zu sein. So habe ich mir mal FPImage (oder FCLImange?) angeschaut. Ehrlich gesagt, da gibt es bei mir einige Vorbehalte, vor allem was die fehlende Dokumentation betrifft. Einige Zeilen Beispielcode ohne fundierte Begründung reichen mir nicht. Nur als Beispiel von der Seite http://wiki.freepascal.org/fcl-image#Walk-through:

Code: Alles auswählen

 Image := TFPMemoryImage.Create(10, 10);
Reader := TFPReaderPNG.Create;
Image.LoadFromFile (AFileName,  Reader);
Scheint recht einfach zu sein, und doch stellen sich mir einige Fragen: Was soll der Konstruktor für die Bitmapgröße 10 x 10? Das ist doch kein reales Maß für ein Image. Handelt es sich hier um Dummies, die intern ignoriert werden? Oder werden zunächst mal die läppischen 100 Pixel allokiert, und anschließend wird beim Laden des Bildes, sobald der benötigte Speicher bekannt ist, das Ganze reallokiert? Was ist mit dem Freigeben des Speichers, geschieht das automatisch, oder muss ich mich drum kümmern, z.B. wenn ich einTFPMemoryImage erneut für weitere Bilder verwenden will?

Das klingt vielleicht kleinkariert, aber wenn es um die Speicherverwaltung geht, und die spielt bei Images eine enorme Rolle, darf es m.E. nicht eine einzige Informationslücke geben, dazu sind die Fehlerquellen zu tückisch und intransparent. Sicher, ich könnte den Quelltext abklabastern, aber dafür wäre der Aufwand doch zu groß, zumal ich die Canvas.Pixels-Methoden nur vorübergehend gebrauche, um einen in Delphi codierten und in einem Tutorial veröffentlichten LOD-Algortihmus nachzuvollziehen. Mir ist auch bekannt, dass canvas.pixels viel zu langsam für ernsthaften Gebrauch ist. Aber der Code liegt nun mal so vor, und der Algorithmus ist so kompliziert, dass ich mich nicht noch mit Randproblemen abgeben möchte. Notfalls installier ich das Programmgerüst noch einmal als LCL-Anwendung.

Gruß
hl

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: TBitmap nicht vorhanden?

Beitrag von Achtzig »

henlambert hat geschrieben:Was soll der Konstruktor für die Bitmapgröße 10 x 10? Das ist doch kein reales Maß für ein Image.
Doch, zum Beispiel die kleinen Bildchen hier im Forum wie Bild mit 11*9 Pixel.

Die anderen Beispiele beziehen sich mehr auf 100*100. Ob da aber nun 10 oder 1000 Pixel als Kantenlänge verwendet werden, sollte doch soweit egal sein. Es wird doch sehr deutlich, was damit gemeint ist.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TBitmap nicht vorhanden?

Beitrag von Socke »

henlambert hat geschrieben:Was soll der Konstruktor für die Bitmapgröße 10 x 10? Das ist doch kein reales Maß für ein Image. Handelt es sich hier um Dummies, die intern ignoriert werden? Oder werden zunächst mal die läppischen 100 Pixel allokiert, und anschließend wird beim Laden des Bildes, sobald der benötigte Speicher bekannt ist, das Ganze reallokiert? Was ist mit dem Freigeben des Speichers, geschieht das automatisch, oder muss ich mich drum kümmern, z.B. wenn ich einTFPMemoryImage erneut für weitere Bilder verwenden will?
Ohne die Klassen zu kennen, nehme ich an
  • Speicher der automatisch allokiert wird, wird auch automatisch freigegeben (die unit heaptrc wirkt bei der Erkenntnisfindung Wunder)
  • Man gibt im Konstruktor eine Bildgröße an, da man nicht dazu gezwungen ist, ein fertiges Bild zu laden
  • In deinem Fall wäre eine initiale Größe von 0x0 Pixel sinnvoll
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: TBitmap nicht vorhanden?

Beitrag von mschnell »

henlambert hat geschrieben:Jedenfalls ist es nur logisch, dass TBitmap auch in Konsolenandwendungen verwendet werden kann.
??? Wieso ????

Ich kann doch z.B. eine CGI-Programm machen wollen und über den Webserver ein Bild an den Browser schicken, dass ich zuvor zusammenbastele (z.B. eine TChart). Da brauche ich doch vermutlich Komponenten wie TBitmap, TCanvas, ..., aber keine grafische Oberfläche.

-Michael

henlambert
Beiträge: 12
Registriert: Di 7. Mai 2013, 18:32

Re: TBitmap nicht vorhanden?

Beitrag von henlambert »

Ich kann doch z.B. eine CGI-Programm machen wollen und über den Webserver ein Bild an den Browser schicken, dass ich zuvor zusammenbastele (z.B. eine TChart). Da brauche ich doch vermutlich Komponenten wie TBitmap, TCanvas, ..., aber keine grafische Oberfläche.
Genau sowas Ähnliches habe ich doch vor: Bilder, die nicht auf einer grafischen Oberfläche dargestellt werden. Aber deckt sich das nicht mit meiner von dir zitierten Aussage?

Doch zu FPImage. Die Parameter im Konstruktor von FPImage haben mich gehörig in Verwirrung gebracht. Wie ich an anderer Stelle schon mal sagte, bin ich neu im Pascal-Lager, wohl aber vertraut mit C++. Dort ist es üblich, für verschiedene Parameteranforderungen auch verschiedene Konstruktoren anzubieten. Oft ist ein parameterloser Standardkonstruktor dabei, wobei u.U. einige Parameter intern durch sinnvolle Default-Werte ersetzt werden. Aber vom Anwender Parameter zu verlangen, die intern keine Rolle spielen, ist nicht gerade optimal und kann verwirren. Irgendwie auch - pardon - unreif.

Ganz abgesehen davon werde FPImage wohl nicht verwenden, und zwar deshalb, weil die FPCanvas-Klasse nicht vollständig kompatibel zum LCL-Canvas zu sein scheint. Danke für die Hinweise.

Gruß

Antworten