![]() |
TBitmap in Konsolen Anwendung
Wir versuchen gerade der Umstellung einer größeren VCL Delphi Anwendung in einen Teil nur Delphi Consolen Code und dann die GUI - entweder in FMX oder LCL neu programmiert - um auf UNIX/LINUX Arbeiten zu können.
Die alte VCL Anwendung verwendet die unit vcl.Graphics und die Klasse TBitmap. Ich habe jetzt den Code 1:1 in eine Konsolenanwendung kopiert, leider bekomme ich eine nicht verständliche AC. ( bin schon mit FASTMM4, Madshi etc. am debuggen alles bisher ohne Erfolg) . der Code führt in der neuen Konsolenanwendung 4 von 5 Prozess-Schritte (incl. Bitmap Operationen) ohne Probleme aus, beim letzten Schritt kommt es zur AV. Da ich die Ergebnisse für jeden Schritt abspeichere, wird beim einem Neustart der Anwendung erkannt, daß die Schritt 1..4 schon ausgeführt wurde, jetzt werden die Ergebnisse von der Festplatte geladen und Schritt 5 ohne Probleme / Bugs /Fehler ausgeführt. (alles sehr unlogisch) Frage : kann es sein, daß vcl.Graphis bzw. die Klasse TBitmap nicht in einer Konsolenanwendung verwendet werden darf?? Erklärt dies mein Fehlerbild ?????? |
AW: TBitmap in Konsolen Anwendung
Schreibst Du denn eine VCLmoser FMX Konsolenanwendung? Hast Du es mal mit FMX.Graphics und dem FMX Bitmap probiert? Ohne Quellcode ist es sonst schwer nachzuvollziehen, was genau passiert.
|
AW: TBitmap in Konsolen Anwendung
Wenn Du mal in die Liste der unterstützten Units unter Linux nachsiehst, wirst Du die FMX.Graphis.pas (wo das TBitmap deklariert ist) nicht finden.
Also: Nein, keine Grafik in der Konsolenanwendung. Wenn Du mit Grafiken arbeiten möchtest, brauchst Du FMXLinux. Da wird dann nahezu jede FMX-Delphi-Standard-Unit unterstützt. |
AW: TBitmap in Konsolen Anwendung
Na ja, aber es geht doch insgesamt.
Ohne Quelltext bzw. die genaue Stelle, an der es hakt, ist diese Frage wahrscheinlich nicht beantwortbar. Und was macht eigentlich eine Frage zu Linux im Win32-Forum? |
AW: TBitmap in Konsolen Anwendung
Zitat:
gruss |
AW: TBitmap in Konsolen Anwendung
Zitat:
|
Dieses Thema wurde am "09. Jun 2018, 20:05 Uhr" von "mkinzler" aus dem Forum "Win32/Win64 API (native code)" in das Forum "Cross-Platform-Entwicklung" verschoben.
|
AW: TBitmap in Konsolen Anwendung
Zitat:
Wenn sie hier angemeldet sind auch wenn es ein Win32 Forum ist. Von daher sehe ich diese Frage als nicht berechtigt an zumal er vergleiche zu Delphi sucht. gruss |
AW: TBitmap in Konsolen Anwendung
Ich weiß nicht in wie fern das umsetzbar ist, unter Windows mit der Winapi kann man sich auch selbst eine bitmap-ähnliche Funktionsweise zusammen Schustern ohne auf die Graphics Unit zurückgreifen zu müssen, Moderator Luckie hat da echt guten Code auf Lager.
Hier ein Beispiel was ich so gefunden habe, aber wie gesagt, ob ein Linux oder ein Mac solche Api Funktionen anbietet ist mir fremd, da musst Du selbst mal suchen wie eine Mögliche Portierung aussehen könnte!
Delphi-Quellcode:
{******************************************************************************}
{ } { Demo Bitmap-Menü } { } { Copyright (c) 2001 Michael Puff } { www.luckie-online.de } { mpuff@luckie-online.de } { } {******************************************************************************} program bitmapmenu; {$R resource.res} uses Windows, Messages; const ClassName = 'WndClass'; AppName = 'Bitmap-Menü-Demo'; WindowWidth = 500; WindowHeight = 350; IDM_KUCKUCK = 1; IDM_LERCHE = 2; IDM_SPATZ = 3; var hMenu, hPopupMenu: Cardinal; { GetLastError } function DisplayErrorMsg(hWnd: THandle): DWORD; var szBuffer: array[0..255] of Char; begin FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, 0, szBuffer, sizeof(szBuffer), nil); MessageBox(hWnd, szBuffer, 'Fehler', MB_ICONSTOP); result := GetLastError; end; procedure MenuBmp(idBmpStart: DWORD; dc: HDC; cntItems, ItemHeight: Byte; hWnd: Cardinal); var i: Integer; hBmp: HBITMAP; bmp: Windows.BITMAP; hdcBmp: HDC; begin for i := 0 to cntItems-1 do begin hBmp := LoadBitmap(hInstance, MAKEINTRESOURCE(idBmpStart+i)); GetObject(hBmp, sizeof(BITMAP), @bmp); hdcBmp := CreateCompatibleDC(dc); SelectObject(hdcBmp, hBmp); StretchBlt(dc, 2, ItemHeight*i+2, 15, 15, hdcBmp, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); end; ReleaseDC(hWnd, hdcBmp); DeleteObject(hBmp); end; function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall; var mi : PMEASUREITEMSTRUCT; di : PDRAWITEMSTRUCT; begin Result := 0; case uMsg of WM_CREATE: begin hMenu := CreateMenu; hPopupMenu := CreateMenu; AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_KUCKUCK, '&Kuckuck'); AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_LERCHE, '&Lerche'); AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_SPATZ, '&Spatz'); AppendMenu(hMenu, MF_POPUP, hPopupMenu, '&Datei'); SetMenu(hWnd, hMenu); end; WM_MEASUREITEM: begin mi := PMEASUREITEMSTRUCT(lParam); case mi.CtlType of ODT_MENU: begin mi.itemWidth := 100; mi.itemHeight := 19; end end; end; WM_DRAWITEM: begin di := PDRAWITEMSTRUCT(lParam); case di.CtlType of ODT_MENU: begin if (di.itemState and ODS_SELECTED = ODS_SELECTED) then begin FillRect(di.hDC, di.rcItem, GetSysColorBrush(COLOR_HIGHLIGHT)); SetTextColor(di.hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); end else begin FillRect(di.hDC, di.rcItem, GetSysColorBrush(COLOR_BTNFACE)); SetTextColor(di.hDC, GetSysColor(COLOR_WINDOWTEXT)); end; SetBkMode(di.hDC, TRANSPARENT); di.rcItem.Left := di.rcItem.left + 30; DrawText(di.hDC, PChar(di.itemData), lstrlen(PChar(di.itemData)), di.rcItem, DT_SINGLELINE or DT_VCENTER); MenuBmp(101, di.hDC, 3, 19, hWnd); end; end; end; WM_COMMAND: begin if HiWord(wParam) = 0 then case LoWord(wParam) of IDM_KUCKUCK: SendMessage(hWnd, WM_CLOSE, 0,0 ); end; end; WM_DESTROY: PostQuitMessage(0); else Result := DefWindowProc(hWnd, uMsg, wParam, lParam); end; end; var wc: TWndClassEx = ( cbSize : SizeOf(TWndClassEx); Style : CS_HREDRAW or CS_VREDRAW; lpfnWndProc : @WndProc; cbClsExtra : 0; cbWndExtra : 0; hbrBackground : COLOR_APPWORKSPACE; lpszMenuName : nil; lpszClassName : ClassName; hIconSm : 0; ); msg: TMsg; begin wc.hInstance := hInstance; wc.hIcon := LoadIcon(0, IDI_APPLICATION); wc.hCursor := LoadCursor(0, IDC_ARROW); RegisterClassEx(wc); CreateWindowEx(0, ClassName, AppName, WS_CAPTION or WS_VISIBLE or WS_SYSMENU, Integer(CW_USEDEFAULT),Integer(CW_USEDEFAULT), WindowWidth, WindowHeight, 0, 0, hInstance, nil); while true do begin if not GetMessage(msg, 0, 0, 0) then break; begin TranslateMessage(msg); DispatchMessage(msg); end; end; ExitCode := msg.wParam; end. |
AW: TBitmap in Konsolen Anwendung
die erste Frage war eigentlich : kann ich einer Win - Konsolenanwendung eine TBitmap verwenden
die Portierung auf LINUX kommt erst später, wäre der zweite teil der Frage ; portiert soll nur die Konsolenanwendung werden, den Datentyp TBitmap hätte ich halt gerne (oder einen Ersatz) Anzeige der Bitmap ist nicht nötig , nur der Zugriff auf die Pixel und deren Modifikation |
AW: TBitmap in Konsolen Anwendung
Na dann passt ja Luckies Code, also für Win32, mit TBitmap greifst Du doch auch nur auf das zu was Dir die Api bietet, oder wie modifizierst Du Pixel (ein Code Happen wäre nett)?
Ps: Um Deine Frage zu beantworten, TBitmap kannst Du in einer Konsolen-Anwendung benutzen, achte darauf das die Unit Graphics als letzte eingebunden wird und Dein TBitmap.Create() irgendwo sicher ausgeführt wird, eventuell stelle da sogar noch den Namespace mit ran (Vcl.Graphics.TBitmap.Create()) bzw var myBmp: Vcl.Graphics.TBitmap. Negativ-Beispiel:
Delphi-Quellcode:
<- da Windows.pas als letztes geladen wird, ist dessen TBitmap nun der Chef
uses Vcl.Graphics, WinApi.Windows;
Positiv-Beispiel:
Delphi-Quellcode:
<- da Graphics.pas als letztes geladen wird, ist dessen TBitmap nun der Chef
uses WinApi.Windows, Vcl.Graphics;
Es mag identisch Wirken, aber die Funktionsweise wird beeinträchtigt. |
AW: TBitmap in Konsolen Anwendung
Wenn Du das Programm später auch auf andere Plattformen portieren willst, würde ich gleich auf eine Lösung setzen, welche auch dort funktioniert.
Was für Bitmapoperationen werden vom Programm durchgeführt? |
AW: TBitmap in Konsolen Anwendung
Hallo,
die letzte Frage ist doch entscheidend. Was geht denn konkret schief? |
AW: TBitmap in Konsolen Anwendung
Html mit Php oder Java Scripten wäre wohl die Universal-Lösung, aber als Konsolen-Anwendung?
|
AW: TBitmap in Konsolen Anwendung
Zitat:
Aber wie schon gesagt, ohne Fehlermeldung und Punkt, an dem sie auftritt, wird man dir nicht helfen können. |
AW: TBitmap in Konsolen Anwendung
Zitat:
Zitat:
U.U.gibt es schon Graphik-Bibliotheken, die das zur Verfügung stellen, aber andere kennen sich da besser aus. Gruß K-H |
AW: TBitmap in Konsolen Anwendung
Oder noch einfacher: Bau dir eine SVG-Datei, das ist nur ein String.
|
AW: TBitmap in Konsolen Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
Ich würde FMX.Graphics dafür nutzen, siehe Beispielprojekt.
Das referenziert nur ein paar FMX Units und sollte auch CrossPlatform fähig sein. Rollo |
AW: TBitmap in Konsolen Anwendung
Aber nicht für Linux. (Ohne FMXLinux)
|
AW: TBitmap in Konsolen Anwendung
Auch wieder wahr.
Rollo |
AW: TBitmap in Konsolen Anwendung
was ich jetzt mitnehme
a) TBitmap in Console unter WINx32 / WINx64 mit VCL.Graphics sollte funktionieren. Auch all der Code der GDI-Windows ( strechtblt, .....) verwendet. b) Den Fehler muss ich woanders in unserer Anwendung suchen - den Code kann ich leider nicht posten :| offener Punkt wenn ich FMX/Linux kaufe um den Datentyp Bitmap zu bekommen a) gehen dann Algorithmen die z.B Scanline für den Pixelzugriff verwenden, wir haben heir viel selber gebaut b) die Microsoft WINDOWS GDI funtionen ( strechblt, ...) werden fehlen ---- bedeutet der Linux Port dann doch den Umstieg auf eine Bildverarbeitungs LIB wie open CV ? |
AW: TBitmap in Konsolen Anwendung
Schau Dir mal die
![]() |
AW: TBitmap in Konsolen Anwendung
Eventuell wäre
![]() Zitat:
|
AW: TBitmap in Konsolen Anwendung
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz