Delphi-PRAXiS
Seite 1 von 3  1 23   

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr.
Seite 1 von 3  1 23   

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