Lazarus vs. VB6

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Lazarus vs. VB6

    Hallo,

    da hier auch Delphi und Lazarus Experten unterwegs sind mal eine Frage.
    Hab jetzt mal eine URI-Rechner den ich mal in VB6 gemacht habe in Lazarus nachgebaut.
    VB6 Exe-Göße 24kB.
    Lazarus 20MB!! ?(

    Hinweise, Tipps, Anregungen sehr willkommen.

    MfG
  • 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!
  • 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.
    Display All
    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.
  • 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. ?(

    The post was edited 1 time, last by caargoo ().

  • 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
  • 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
  • Danke an Six für die bisher geleistete Hilfe.

    Bin grad am testen des Ini-Beispiels.
    Mir hauts grad die Fehlermeldungen nur so um die Ohren.
    bascomforum.de/index.php?attac…c5032b9a39198cd7abea34f99

    Mein Testprog:

    Source Code

    1. unit Unit1;
    2. {$mode objfpc}{$H+}
    3. interface
    4. uses
    5. Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin,
    6. Inifiles, FileUtil;
    7. type
    8. { TForm1 }
    9. TForm1 = class(TForm)
    10. CheckBox1: TCheckBox;
    11. Edit1: TEdit;
    12. SpinEdit1: TSpinEdit;
    13. procedure FormShow(Sender: TObject);
    14. private
    15. public
    16. end;
    17. var
    18. Form1: TForm1;
    19. implementation
    20. {$R *.lfm}
    21. { TForm1 }
    22. procedure TForm1.FormShow(Sender: TObject);
    23. var
    24. MEINE_ERSTE_INI: TINIFile;
    25. begin
    26. MEINE_ERSTE_INI:= TINIFile.Create(extractfilepath(Application.exename) + 'Meine.ini');
    27. Edit1.Text:= MEINE_ERSTE_INI.ReadString('Form1', 'Edit1', '');
    28. CheckBox1.checked:= MEINE_ERSTE_INI.ReadBool('Form1','CheckBox',False);
    29. SpinEdit1.Value:= MEINE_ERSTE_INI.ReadInteger('Form1','SpinEdit1',0);
    30. MEINE_ERSTE_INI.free;
    31. end;
    32. end.
    Display All
    Vielleicht hast Du ja eine Idee dazu.

    MfG
    Files
    • Error.PNG

      (12 kB, downloaded 6 times, last: )
  • Also ich hab mal dein Programm etwas abgeändert und so funktioniert es bei mir

    LAZARUS-Quellcode

    1. unit Unit1;
    2. {$mode objfpc}{$H+}
    3. interface
    4. uses
    5. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
    6. Spin, IniFiles;
    7. type
    8. { TForm1 }
    9. TForm1 = class(TForm)
    10. CheckBox1: TCheckBox;
    11. Edit1: TEdit;
    12. SpinEdit1: TSpinEdit;
    13. procedure FormShow(Sender: TObject);
    14. private
    15. public
    16. end;
    17. var
    18. Form1: TForm1;
    19. MeineErsteIni: TINIFile;
    20. implementation
    21. {$R *.lfm}
    22. { TForm1 }
    23. procedure TForm1.FormShow(Sender: TObject);
    24. var IniDatei: String;
    25. begin
    26. IniDatei := ExtractFilePath(Application.exename) + 'Meine.ini';
    27. ShowMessage(IniDatei);
    28. MeineErsteIni := TIniFile.Create(IniDatei);
    29. Edit1.Text := MeineErsteIni.ReadString('Form1', 'Edit1', '');
    30. CheckBox1.checked := MeineErsteIni.ReadBool('Form1','CheckBox',False);
    31. SpinEdit1.Value := MeineErsteIni.ReadInteger('Form1','SpinEdit1',0);
    32. MeineErsteIni.free;
    33. end;
    34. end.
    Display All
    Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.