toxin писал(а):-они сильно пахожи ?
Delphi - усовершенствованный вариант Паскаля. Условно говоря, Паскаль предоставляет Вам кирпичи, раствор, деревянные брусья, шифер, стекло, чтобы Вы из этого можгли сами себе построить дом какой хотите. В Дельфи дополнительно введены некие унифицированные блоки ускоряющие строительство - панели с окнами и дверями, клозеты, набранная крыша с рамами и уложенным шифером. Т.е. набор готовых блоков из тех же строительных материалов. Lazarus Вам предоставляет такие-же унифицированные блоки, что и Дельфи, только поскромнее ассортиментом.
Вот Вам пример создания окна с кнопкой на чистом Паскале:
- Код: Выделить всё
program my_prog;
uses windows;
const
{ names of window classes. }
WND_CLASS_NAME0 = 'my_wnd_class_name_0';
{ identifiers. }
IDC_BUTTON0 = 2000;
{ function prototypes }
function wnd_proc0(window: HWND; message: UINT; w_param: WPARAM; l_param: LPARAM): LRESULT; stdcall; forward; export;
function create_wnd0: HWND; forward;
procedure create_wnd_content0(parent: HWND); forward;
{ global data }
var instance: longint; { HINSTANCE }
h_font: HFONT;
{ window procedure #0 [window] }
function wnd_proc0(window: HWND; message: UINT; w_param: WPARAM; l_param: LPARAM): LRESULT; stdcall; export;
begin
case message of
WM_COMMAND:
begin
case LOWORD(w_param) of
IDC_BUTTON0: { button 'button' }
begin
MessageBox(window, 'the button IDC_BUTTON0 is clicked.', 'Event', MB_OK or MB_ICONINFORMATION);
end;
end;
end;
WM_CREATE:
begin
create_wnd_content0(window);
end;
WM_CLOSE:
begin
if IDYES = MessageBox(window, 'Quit?', 'Event', MB_YESNO or MB_ICONQUESTION) then DestroyWindow(window);
end;
WM_DESTROY:
begin
PostQuitMessage(0); { PostQuitMessage(return_code) quits the message loop }
end;
else
begin
wnd_proc0 := DefWindowProc(window, message, w_param, l_param);
exit;
end;
end;
wnd_proc0 := 0;
end;
{ create window #0 [window]. }
function create_wnd0: HWND;
var
wnd: HWND;
begin
wnd := CreateWindowEx($00000100, WND_CLASS_NAME0, 'window', $14CF0000, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, 0, 0, instance, nil);
ShowWindow(wnd, SW_SHOWNORMAL);
UpdateWindow(wnd);
create_wnd0 := wnd;
end;
{ create window content #0 [window]. }
procedure create_wnd_content0(parent: HWND);
var
wnd: HWND;
begin
wnd := CreateWindowEx($00000000, 'Button', 'button', $50012F00, 136, 184, 96, 32, parent, HMENU(IDC_BUTTON0), instance, nil);
SendMessage(wnd, WM_SETFONT, WPARAM(h_font), 1);
end;
procedure register_classes;
var wc: WNDCLASS;
begin
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
wc.hbrBackground := HBRUSH(COLOR_3DFACE + 1);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hInstance := instance;
wc.lpszMenuName := nil;
wc.style := CS_PARENTDC or CS_DBLCLKS;
wc.lpfnWndProc := @wnd_proc0;
wc.lpszClassName := WND_CLASS_NAME0;
RegisterClass(@wc);
end;
{ message loop }
function message_loop: integer;
var message: MSG;
begin
while GetMessage(@message, 0, 0, 0) do
begin
TranslateMessage(@message);
DispatchMessage(@message);
end;
message_loop := message.wParam;
end;
BEGIN
instance := GetModuleHandle(nil);
register_classes;
h_font := CreateFont(-13, 0, 0, 0, FW_NORMAL, 0,
0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, 'Times New Roman');
create_wnd0;
message_loop();
END.
Программа ничего толкового не делает, только выдаёт сообщение на нажатие кнопки.
А вот тоже самое с помощью Lazarus:
Главный файл:
- Код: Выделить всё
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms
{ you can add units after this }, Unit1;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Файл описания окошка:
- Код: Выделить всё
object Form1: TForm1
Left = 290
Height = 300
Top = 175
Width = 400
Caption = 'Form1'
ClientHeight = 300
ClientWidth = 400
LCLVersion = '0.9.25'
object Button1: TButton
Left = 160
Height = 25
Top = 201
Width = 75
Caption = 'Button1'
OnClick = Button1Click
TabOrder = 0
end
end
Файл ресурсов окошка:
- Код: Выделить всё
{ Это - файл ресурсов, автоматически созданный lazarus }
LazarusResources.Add('TForm1','FORMDATA',[
'TPF0'#6'TForm1'#5'Form1'#4'Left'#3'"'#1#6'Height'#3','#1#3'Top'#3#175#0#5'Wi'
+'dth'#3#144#1#7'Caption'#6#5'Form1'#12'ClientHeight'#3','#1#11'ClientWidth'#3
+#144#1#10'LCLVersion'#6#6'0.9.25'#0#7'TButton'#7'Button1'#4'Left'#3#160#0#6
+'Height'#2#25#3'Top'#3#201#0#5'Width'#2'K'#7'Caption'#6#7'Button1'#7'OnClick'
+#7#12'Button1Click'#8'TabOrder'#2#0#0#0#0
]);
И самый нужный для программиста файл, в котором он пишет собственный код:
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Ага! Попался!!!');
end;
initialization
{$I unit1.lrs}
end.
Первые три файла создаются автоматически Lazarus'ом, последний создаётся полуавтоматом, т.е. туда Lazarus'ом вставляются шаблоны функций, например на нажатие кнопки:
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
end;
а вот то, что должно быть в функции пишет сам программист.
Итак, главное отличие - в Паскале всё, от первого до последнего символа, пишет сам программист вручную, а вот Lazarus (Delphi) добрую половину работы (например по созданию окошек с кнопками) делает автоматически.
toxin писал(а):Но поверхностное изучение обоих языков дало впечатление что pascal слабее чем C/C++
Это так ?
Нет, не так. Просто некоторые вещи в Си и Паскале делаются несколько по разному. Но в подавляющем большинстве случаев прикладного программирования эти языки полностью взаимозаменяемые.