Lazarus vs. VB6

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

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • 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.
  • 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.
  • 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
  • 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 ()

  • 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…c1c911ccb3c1b5c78dcf9b455

    Mein Testprog:

    Quellcode

    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.
    Alles anzeigen
    Vielleicht hast Du ja eine Idee dazu.

    MfG
    Dateien
    • Error.PNG

      (12 kB, 6 mal heruntergeladen, zuletzt: )
  • 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.
    Alles anzeigen
    Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.