Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   TBitmap in Konsolen Anwendung (https://www.delphipraxis.net/196686-tbitmap-konsolen-anwendung.html)

bernhard_LA 9. Jun 2018 14:23

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 ??????

timog 9. Jun 2018 16:11

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.

Harry Stahl 9. Jun 2018 17:03

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.

Redeemer 9. Jun 2018 17:59

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?

EWeiss 9. Jun 2018 18:30

AW: TBitmap in Konsolen Anwendung
 
Zitat:

Und was macht eigentlich eine Frage zu Linux im Win32-Forum?
Du kannst es ja ignorieren wenn es dir Unbehagen bereitet.

gruss

mkinzler 9. Jun 2018 19:04

AW: TBitmap in Konsolen Anwendung
 
Zitat:

Zitat von EWeiss (Beitrag 1404355)
Zitat:

Und was macht eigentlich eine Frage zu Linux im Win32-Forum?
Du kannst es ja ignorieren wenn es dir Unbehagen bereitet.

gruss

Ist doch eine berechtigte Frage.

DP-Maintenance 9. Jun 2018 19:05

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.

EWeiss 9. Jun 2018 19:18

AW: TBitmap in Konsolen Anwendung
 
Zitat:

Zitat von mkinzler (Beitrag 1404360)
Zitat:

Zitat von EWeiss (Beitrag 1404355)
Zitat:

Und was macht eigentlich eine Frage zu Linux im Win32-Forum?
Du kannst es ja ignorieren wenn es dir Unbehagen bereitet.

gruss

Ist doch eine berechtigte Frage.

Nur wo sollen die User denn sonst posten?
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

KodeZwerg 9. Jun 2018 20:40

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.

bernhard_LA 10. Jun 2018 00:36

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

KodeZwerg 10. Jun 2018 00:43

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:
uses Vcl.Graphics, WinApi.Windows;
<- da Windows.pas als letztes geladen wird, ist dessen TBitmap nun der Chef
Positiv-Beispiel:
Delphi-Quellcode:
uses WinApi.Windows, Vcl.Graphics;
<- da Graphics.pas als letztes geladen wird, ist dessen TBitmap nun der Chef

Es mag identisch Wirken, aber die Funktionsweise wird beeinträchtigt.

mkinzler 10. Jun 2018 09:02

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?

hoika 10. Jun 2018 09:31

AW: TBitmap in Konsolen Anwendung
 
Hallo,
die letzte Frage ist doch entscheidend.
Was geht denn konkret schief?

KodeZwerg 10. Jun 2018 09:59

AW: TBitmap in Konsolen Anwendung
 
Html mit Php oder Java Scripten wäre wohl die Universal-Lösung, aber als Konsolen-Anwendung?

Redeemer 10. Jun 2018 10:22

AW: TBitmap in Konsolen Anwendung
 
Zitat:

Zitat von bernhard_LA (Beitrag 1404395)
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

Ich zeichne sehr gerne auf TPNGImage, wenn ich ein Bild von Grundauf erstelle. Macht auch meine SVGEngine.

Aber wie schon gesagt, ohne Fehlermeldung und Punkt, an dem sie auftritt, wird man dir nicht helfen können.

p80286 10. Jun 2018 10:29

AW: TBitmap in Konsolen Anwendung
 
Zitat:

Zitat von bernhard_LA (Beitrag 1404395)
Anzeige der Bitmap ist nicht nötig , nur der Zugriff auf die Pixel und deren Modifikation

Zitat:

TBitmap kapselt ein Windows-Bitmap (HBITMAP) und dessen Palette (HPALETTE).

Wenn Dir kein Windows zur Verfügung steht mußt Du Dir die Bitmap nach alter DOS-Väter Sitte per Array selbst basteln.
U.U.gibt es schon Graphik-Bibliotheken, die das zur Verfügung stellen, aber andere kennen sich da besser aus.

Gruß
K-H

Redeemer 10. Jun 2018 10:37

AW: TBitmap in Konsolen Anwendung
 
Oder noch einfacher: Bau dir eine SVG-Datei, das ist nur ein String.

Rollo62 11. Jun 2018 06:52

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

mkinzler 11. Jun 2018 07:07

AW: TBitmap in Konsolen Anwendung
 
Aber nicht für Linux. (Ohne FMXLinux)

Rollo62 11. Jun 2018 13:03

AW: TBitmap in Konsolen Anwendung
 
Auch wieder wahr.

Rollo

bernhard_LA 11. Jun 2018 20:27

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 ?

mkinzler 11. Jun 2018 20:43

AW: TBitmap in Konsolen Anwendung
 
Schau Dir mal die SDL an

Uwe Raabe 11. Jun 2018 21:01

AW: TBitmap in Konsolen Anwendung
 
Eventuell wäre CrossVCL auch eine Alternative:
Zitat:

TCanvas and TBitmap behave on macOS and Linux like on Windows.

Harry Stahl 12. Jun 2018 02:21

AW: TBitmap in Konsolen Anwendung
 
Zitat:

Zitat von bernhard_LA (Beitrag 1404577)

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 ?

Statt Scanline kannst Du TBitmapdata verwenden, einführendes dazu hatte ich hier schon vor einigen Jahren in meinem Blog veröffentlicht:

http://www.devpage.de/blog/firemonkey.htm (Beitrag Nr. 4, Grafikbearbietung in FMX).


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz