Lazarus vs. VB6

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Neu

      Bei VB6-Programmen wird eigentlich keine richtige EXE generiert, sondern ein Bytecode.
      Um den auszuführen verwendet VB6 eine virtuelle Runtime Maschine (mir fällt der Name gerade nicht ein).
      Den müsste man eigentlich bei VB6-Programmen mit rechnen.

      Bei Lazarus wird eine richtige EXE erzeugt, die keine virtuelle Maschine mehr braucht. daher wird der Code länger.

      Ich finde die Lösung bei VB6 sehr interessant, da man so bei vielen VB6-Prigrammen eine Menge an HDD-Speicher einspart.
      Nachteil ist aber eine etwas langsamere Ausführung des Byte-Codes, weil der auch erst zur Laufzeit in die Maschinencodes übersetzt wird.
      Kaum macht man es richtig - und schon geht's!
    • Neu

      Hier mal ein kleines Beispiel für eine Anwendung ohne VCL

      LAZARUS-Quellcode

      1. program test1;
      2. uses windows, messages;
      3. {$WARNINGS OFF}
      4. {$HINTS OFF}
      5. {$R main.res}
      6. const
      7. windowleft: integer = 100;
      8. windowtop: integer = 100;
      9. windowwidth: integer = 265;
      10. windowheight: integer = 202;
      11. ClassName = 'ATestWndClassEx';
      12. var
      13. hdlg: DWORD = 0;
      14. function dlgfunc(hwnd: hwnd; umsg: dword; wparam: wparam;
      15. lparam: lparam): bool; stdcall;
      16. begin
      17. result := true;
      18. CASE umsg OF
      19. WM_CLOSE:
      20. EndDialog(hWnd, 0);
      21. WM_DESTROY:
      22. PostQuitMessage(0);
      23. WM_COMMAND:
      24. IF hiword(wparam) = BN_CLICKED THEN BEGIN
      25. CASE loword(wparam) OF
      26. IDOK:
      27. sendmessage(hwnd, WM_CLOSE, 0, 0);
      28. end;
      29. end;
      30. else result := false;
      31. end;
      32. end;
      33. function WndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM;
      34. lParam: LPARAM): LRESULT; stdcall;
      35. var IDOK: DWORD;
      36. begin
      37. Result := 0;
      38. case uMsg OF
      39. WM_CREATE:
      40. begin
      41. IDOK := createwindow('BUTTON', 'OK-Button',
      42. WS_VISIBLE OR WS_CHILD, 100, 100, 100, 30, hwnd, 0, hInstance,
      43. NIL);
      44. if IDOK = INVALID_HANDLE_VALUE then
      45. MessageBox(hwnd, 'Button nicht erzeugt', 'Meldung', 0);
      46. end;
      47. WM_DESTROY:
      48. begin
      49. PostQuitMessage(0);
      50. end;
      51. WM_COMMAND:
      52. if hiword(wparam) = BN_CLICKED then
      53. sendmessage(hwnd, WM_CLOSE, 0, 0);
      54. //if loword(wparam) = IDOK then
      55. // MessageBox(hwnd, 'OK Button gedrückt', 'Meldung', 0);
      56. else
      57. Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
      58. end;
      59. end;
      60. var wc: TWndClassEx = (
      61. cbSize: SizeOf(TWndClassEx);
      62. style: CS_OWNDC OR CS_HREDRAW OR CS_VREDRAW;
      63. cbClsExtra: 0;
      64. cbWndExtra: 0;
      65. hbrBackground: COLOR_WINDOW;
      66. lpszMenuName: NIL;
      67. lpszClassName: ClassName;
      68. hIconSm: 1; );
      69. mainwnd:DWORD; //not needed
      70. msg: TMSG;
      71. rect: trect;
      72. deskh, deskw: integer;
      73. ncm: tagNONCLIENTMETRICS;
      74. begin
      75. //hdlg := DialogBoxParam(HInstance, MAKEINTRESOURCE(100), 0, @DlgFunc, 0);
      76. with wc do begin
      77. hInstance := HInstance;
      78. hIcon := LoadIcon(HInstance, 'SOL.ico'{MAKEINTRESOURCE(1)});
      79. hIconSm := LoadIcon(HInstance, 'Sol.ico');
      80. hCursor := LoadCursor(0, IDC_ARROW);
      81. lpfnWndProc := @WndProc;
      82. end;
      83. systemparametersinfo(SPI_GETWORKAREA, 0, @rect, 0);
      84. deskw := rect.Right - rect.Left;
      85. deskh := rect.Bottom - rect.Top;
      86. ncm.cbSize := sizeof(ncm);
      87. systemparametersinfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), @ncm, 0);
      88. //windowwidth := windowleft + windowwidth;
      89. //windowheight := windowtop + windowheight + ncm.iMenuHeight +
      90. //ncm.iCaptionHeight;
      91. //Windowleft := (deskw DIV 2) - (windowwidth DIV 2);
      92. //Windowtop := (deskh DIV 2) - (windowheight DIV 2);
      93. RegisterClassEx(wc);
      94. mainwnd:= CreateWindowEx(WS_EX_WINDOWEDGE OR WS_EX_CONTROLPARENT
      95. OR WS_EX_APPWINDOW,
      96. ClassName,
      97. 'Caption',
      98. WS_OVERLAPPED
      99. OR WS_CAPTION
      100. OR WS_SYSMENU
      101. OR WS_MINIMIZEBOX
      102. OR WS_VISIBLE,
      103. windowleft,
      104. windowtop,
      105. windowwidth,
      106. windowheight,
      107. 0,
      108. 0,
      109. hInstance,
      110. NIL);
      111. while True do begin
      112. if not GetMessage(msg, 0, 0, 0) then break; //oops :o)
      113. translatemessage(msg);
      114. dispatchmessage(msg);
      115. end;
      116. ExitCode := GetLastError;
      117. end.
      Alles anzeigen
      Die Exe-Datei hat dann nur noch eine Größe von 16KB.
      In VB ist es vom Umfang her auch nicht anders als oben, wenn man eine Anwendung erstellt.
      Allerdings muss man im Beispiel oben alles selber schreiben.
      Delphi/Lazarus ist eine visuelle Umgebung und es wird alles notwendige und auch nicht notwendige mit eingebunden, nimmt einem aber sehr viel Arbeit ab.
      Deshalb sind die Exe-Dateien auch größer.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Neu

      Danke erstmal für die ausführlichen Erklärungen.
      Wie schon gesagt, bin nur kleiner Hobbyist.
      Habe es mittlerweile geschafft von 20MB auf 2,5MB zu verkleinern. a_64_3a718cae
      @six1
      trotzdem wäre eine kleine Ausführung zum Release Modus und Runtime Libs nett.
      Hab dazu keinen Plan. ?(

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von caargoo ()

    • Neu

      Ok, du hattest noch eine zweite Frage: Runtime Lib

      Wenn ein Projekt in VB oder c# so verdächtig klein ist, dann liegt das einfach daran, dass jede Menge DLL's auf dem Rechner installiert sein müssen, damit die Programme lauffähig sind. Schau mal bei deinem Rechner in "installierte Programme". Da wirst du jede Menge Microsoft Runtime Libs sehen. Auch .Net Bibliotheken.

      Lazarus Programme brauchen das nicht. Du erhälst nach dem Kompilieren im Normalfall eine .exe Datei, welche auf Windows Rechner lauffähig ist, ohne weitere Dinge installieren zu müssen.
      Code first, think later - Natural programmer :D
    • Neu

      Ich habe mir bereits vor Jahren PurBasic gekauft hatte auch guten Kontakt in der Community.
      Jedoch ist PureBasic weniger geeignet, um aufwändige GUI Applicationen zu entwickeln.
      Es fehlt schon an einem gescheiten grafischen Designer. Der mitgelieferte zerreißt oft das ganze Projekt. a_27_b277ca12

      Ich habe wirklich nur ganz kleine Programme damit gemacht und selbst da ist es sehr viel "Handarbeit" alles gescheit hin zu bekommen.

      Meine Meinung:

      Absolut nicht vergleichbar mit RAD Entwicklungstools wie Delphi oder Lazarus...


      EDIT: Ich habe jetzt " Darstellung von HTML aktivieren Sie können HTML zur Formatierung Ihrer Nachricht nutzen." abgeschaltet, dann geht es.
      Ich werde das jetzt mal Forumsweit umstellen, in der Hoffnung, dass es dann funktioniert
      Code first, think later - Natural programmer :D
    • Neu

      Also das mit dem GUI-designen ist schon etwas aufwendiger, geht aber:

      bild2.jpg

      Vorteil auch, ich konnte dierekt aus dem Programm meine RS485 Bascom-Module (ATMEGA's) flashen.
      Vereinfacht die Sache beim Update einer Haussteuerung, die ja nun mal logischerweise im ganzen Haus verteilt ist.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von der_raabe ()