Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Вниз

Написание программ в Delphi на WinApi   Найти похожие ветки 

 
yahoo ©   (2008-04-20 20:45) [0]

Решил попробовать писать программы на WinApi,пока только получилось создать саму форму ,батоны и едиты...Решил сделать калькулятор...
Сначало все работало , хз из за чего потом перестало норм брать текст из едита...Вообщем вопрос по существу где тут ошибка?
Код урезал) только кнопка "0" и едит
program Project1;
uses
 windows,
 messages,sysutils;
const
 id_Button0 = 100;
 id_edit = 110;
var
cymm:string;
function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam;
  lParam: lParam): LRESULT; stdcall; export;
var
 Rect: TRect;
 ps: TPaintStruct;
 s:Pansichar;
 s2:string;
begin
cymm:="0";
  Result := 0;
  case Msg of
  wm_Create:   begin
        CreateWindowEx (0, // extended styles
       "BUTTON", // predefined class
       "&0", // caption
       ws_Child or ws_Visible or ws_Border
         or bs_PushButton, // styles
       25, 110, // position: see wm_Size
       45, 20, // size
       hWindow, // parent
       id_Button0, // identifier (not a menu handle)
       hInstance, // application id
       nil); // init info pointer
       CreateWindowEx (0, // extended styles
       "EDIT", // predefined class
       "", // text
       ws_Child or ws_Visible or ws_Border
         or ES_RIGHT, // styles
       10, 5, // position: see wm_Size
       120, 20, // size
       hWindow, // parent
       id_edit, // identifier (not a menu handle)
       hInstance, // application id
       nil); // init info pointer
       end;
   wm_Size:
   begin
     GetClientRect (hWindow, Rect);
   end;
    WM_PAINT:
      begin
       BeginPaint(hWindow, ps);
        SetBkMode(ps.hdc, TRANSPARENT);
        EndPaint(hWindow, ps);
      end;
    WM_DESTROY: PostQuitMessage(0);
    wm_Command:begin
    case LoWord (wParam) of
    id_Button0:
         if HiWord (wParam) = bn_Clicked then  begin
              GetWindowText(GetDlgItem (hWindow, id_edit),s,50);
              s2:= s;
              s2:=s2+"0";
              s:=Pchar(s2);
              SetWindowText(GetDlgItem (hWindow, id_edit),s);
            end  end
            end
    else
      begin
        Result := DefWindowProc(hWindow, Msg, wParam, lParam);
        Exit;
      end;
  end;
end;
var
  wc: TWndClass;
  hWindow: HWND;
  Msg: TMsg;
begin
  wc.lpszClassName := "YourAppClass";
  wc.lpfnWndProc   := @MainWndProc;
  wc.Style         := CS_VREDRAW or CS_HREDRAW;
  wc.hInstance     := hInstance;
  wc.hIcon         := LoadIcon(0, IDI_APPLICATION);
  wc.hCursor       := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := (COLOR_WINDOW + 1);
  wc.lpszMenuName  := nil;
  wc.cbClsExtra    := 0;
  wc.cbWndExtra    := 0;
  RegisterClass(wc);
  hWindow := CreateWindowEx(WS_EX_CONTROLPARENT or WS_EX_WINDOWEDGE,
    "YourAppClass",
    "API",
    WS_VISIBLE or WS_CLIPSIBLINGS or
    WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    150, 200 ,
    0,
    0,
    hInstance,
    nil);
  ShowWindow(hWindow, CmdShow);
  UpDateWindow(hWindow);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  Halt(Msg.wParam);
end.


P.S. дайте плиз линки на норм инфу об WinApi и примеры создания компанентов.


 
Andy BitOff ©   (2008-04-20 20:49) [1]

> дайте плиз линки на норм инфу об WinApi

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/anch_win32com.asp


 
Dmitry S ©   (2008-04-20 20:53) [2]


> sysutils

А это зачем?


 
yahoo ©   (2008-04-20 20:58) [3]


> Dmitry S ©   (20.04.08 20:53) [2]
> > sysutilsА это зачем?

для того чтоб inttostr работал...для калькулятора, в едите же тип стринг...


 
Dmitry S ©   (2008-04-20 21:01) [4]

А в чем тогда прикол писать на WinApi?


 
yahoo ©   (2008-04-20 21:07) [5]


> Dmitry S ©   (20.04.08 21:01) [4]
> А в чем тогда прикол писать на WinApi?

А как по другому сделать перевод из стрингов в интеджер и тд?
А прикол - знание сила ... может пригодится в будущем...

P.S. есть примеры программ на WinApi?


 
Dmitry S ©   (2008-04-20 21:10) [6]

есть процедура val ;)
Примеры есть...


 
yahoo ©   (2008-04-20 21:18) [7]

Dmitry S можешь поделиться?


 
{RASkov} ©   (2008-04-20 21:20) [8]

> для того чтоб inttostr работал...

> [6] Dmitry S ©   (20.04.08 21:10)
> есть процедура val ;)

Она в другую сторону работает ;)
Впрочем это не аргумент в пользу SysUtils... :)


 
Dmitry S ©   (2008-04-20 21:28) [9]


> {RASkov} ©   (20.04.08 21:20) [8]

Я про это:

> А как по другому сделать перевод из стрингов в интеджер
> и тд?



> yahoo ©   (20.04.08 21:18) [7]

минут через 10 выложу... Открыточка моя=)


 
{RASkov} ©   (2008-04-20 21:33) [10]

function InStr(I: Integer): string;
begin
 Str(I, Result);
end;

function InInt(S: string): Integer;
var Code: Integer;
begin
 Val(S, Result, Code);
 if Code<>0 then begin
  Result:=0;
 end;
end;


 
yahoo ©   (2008-04-20 21:33) [11]

никто не знает почему
GetWindowText(GetDlgItem (hWindow, id_edit),s,50); выдает не то что внесено в едит?
если

...
const
 id_edit = 110;
....
CreateWindowEx (0, "EDIT","",ws_Child or ws_Visible or ws_Border
         or ES_RIGHT,10, 5, 120, 20,  hWindow, id_edit,hInstance, nil);
...


 
yahoo ©   (2008-04-20 21:35) [12]


> {RASkov} ©   (20.04.08 21:33) [10]
> function InStr(I: Integer): string;begin  Str(I, Result);
> end;function InInt(S: string): Integer;var Code: Integer;
> begin  Val(S, Result, Code);  if Code<>0 then begin   Result:
> =0;  end;end;

спасибо )


 
DVM ©   (2008-04-20 21:46) [13]


> никто не знает почему
> GetWindowText(GetDlgItem (hWindow, id_edit),s,50); выдает
> не то что внесено в едит?

Пушкин знает, который память выделял под S.


 
Dmitry S ©   (2008-04-20 21:53) [14]

Лови=)
http://argi.ru/heart3.rar


 
yahoo ©   (2008-04-20 21:54) [15]


> DVM ©   (20.04.08 21:46) [13]
> > никто не знает почему > GetWindowText(GetDlgItem (hWindow,
>  id_edit),s,50); выдает > не то что внесено в едит?Пушкин
> знает, который память выделял под S.

полный код в первом посте...  
уже сам нашел в чем баг, надо просто объявить не в функции а выше...


 
Dmitry S ©   (2008-04-20 21:56) [16]

ch: Thandle;
s: PChar;
sl: Integer;

ch := GetDlgItem (hWindow, id_edit);
sl := GetWindowTextLength(ch);
getMem(s, sl+1);
ZeroMemory(s, sl+1);
GetWindowText(ch,s,50);

...

freeMem(s)


 
DVM ©   (2008-04-20 21:58) [17]


> yahoo ©   (20.04.08 21:54) [15]


> полный код в первом посте...  

в полном коде я тоже не вижу ни выделения памяти под S ни даже определения того сколько ее (памяти) надо выделять.


 
yahoo ©   (2008-04-20 21:58) [18]

!  ...\heart3.rar: Ошибка CRC в Heart3.exe, файл повреждён
!   ...\heart3.rar: Неожиданный конец архива

*.res нету ) и ехе не обезательно в архив


 
DVM ©   (2008-04-20 22:00) [19]


> уже сам нашел в чем баг, надо просто объявить не в функции
> а выше...

баг ты не нашел, ты его переместил.


 
yahoo ©   (2008-04-20 22:00) [20]


> DVM ©   (20.04.08 21:58) [17]
> > yahoo ©   (20.04.08 21:54) [15] > полный код в первом
> посте...  в полном коде я тоже не вижу ни выделения памяти
> под S ни даже определения того сколько ее (памяти) надо
> выделять.

спасибо, буду знать


 
Dmitry S ©   (2008-04-20 22:17) [21]


> !  ...\heart3.rar: Ошибка CRC в Heart3.exe, файл повреждён
> !   ...\heart3.rar: Неожиданный конец архива
>
> *.res нету ) и ехе не обезательно в архив

ща перезалью


 
yahoo ©   (2008-04-20 22:19) [22]


> Dmitry S ©   (20.04.08 21:56) [16]
> ch: Thandle;s: PChar;sl: Integer;ch := GetDlgItem (hWindow,
>  id_edit);sl := GetWindowTextLength(ch);getMem(s, sl+1);
> ZeroMemory(s, sl+1);GetWindowText(ch,s,50);...freeMem(s)

freeMem(s) при закрытии программы что ли? а то если делать после ее использования ,то выдает "invalid pointer operation"


 
Dmitry S ©   (2008-04-20 22:20) [23]

http://argi.ru/heart3-w.rar


> freeMem(s)

после того, как s уже не нужно.


 
yahoo ©   (2008-04-20 22:21) [24]

вообще когда доходит прога до  freeMem(s);  выдает "invalid pointer operation" ... =(


 
Dmitry S ©   (2008-04-20 22:22) [25]

дай весь код


 
yahoo ©   (2008-04-20 22:32) [26]

program Project1;

uses
 windows,
 messages,sysutils;

const
 id_Button0 = 100;
 id_edit = 110;



function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam;
  lParam: lParam): LRESULT; stdcall; export;
var
 Rect: TRect;
 ps: TPaintStruct;
  s2:string;
  ch: Thandle;
s: PChar;
sl: Integer;
begin
  Result := 0;
  case Msg of
  wm_Create:
   begin
       CreateWindowEx (0,"BUTTON","&0",ws_Child or ws_Visible
       or ws_Border or bs_PushButton,25, 110,45, 20,hWindow,
       id_Button0, hInstance, nil);

       CreateWindowEx (0,"EDIT","",
       ws_Child or ws_Visible or ws_Border or ES_RIGHT,
       10, 5,120, 20,hWindow,id_edit, hInstance,nil);
   end;
   wm_Size:
   begin
     GetClientRect (hWindow, Rect);
    end;
   WM_PAINT:
      begin
       BeginPaint(hWindow, ps);
        SetBkMode(ps.hdc, TRANSPARENT);
        EndPaint(hWindow, ps);
      end;
    WM_DESTROY: begin  freeMem(s);PostQuitMessage(0);end;
    wm_Command:begin
    case LoWord (wParam) of
    id_Button0:
         if HiWord (wParam) = bn_Clicked then  begin
             ch := GetDlgItem (hWindow, id_edit);
             sl := GetWindowTextLength(ch);
             getMem(s, sl+1);
             ZeroMemory(s, sl+1);
             GetWindowText(ch,s,50);
             s2:= s;
             s2:=s2+"0";
             s:=Pchar(s2);
             SetWindowText(GetDlgItem (hWindow, id_edit),s);
             freeMem(s)
             end;
         end;
        end;
    else
      begin
        Result := DefWindowProc(hWindow, Msg, wParam, lParam);
        Exit;
      end;
  end;
end;
var
  wc: TWndClass;
  hWindow: HWND;
  Msg: TMsg;
begin
  wc.lpszClassName := "YourAppClass";
  wc.lpfnWndProc   := @MainWndProc;
  wc.Style         := CS_VREDRAW or CS_HREDRAW;
  wc.hInstance     := hInstance;
  wc.hIcon         := LoadIcon(0, IDI_APPLICATION);
  wc.hCursor       := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := (COLOR_WINDOW + 1);
  wc.lpszMenuName  := nil;
  wc.cbClsExtra    := 0;
  wc.cbWndExtra    := 0;
  RegisterClass(wc);
  hWindow := CreateWindowEx(WS_EX_CONTROLPARENT or WS_EX_WINDOWEDGE,
    "YourAppClass",
    "API",
    WS_VISIBLE or WS_CLIPSIBLINGS or
    WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    150, 200 ,
    0,
    0,
    hInstance,
    nil);
  ShowWindow(hWindow, CmdShow);
  UpDateWindow(hWindow);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  Halt(Msg.wParam);
end.


 
yahoo ©   (2008-04-20 22:33) [27]


> Dmitry S ©   (20.04.08 22:20) [23]
> http://argi.ru/heart3-w.rar

спасибо


 
Сергей М,   (2008-04-20 22:36) [28]


> Halt(Msg.wParam);


Это что такое ?


 
DVM ©   (2008-04-20 22:37) [29]


>              sl := GetWindowTextLength(ch);
>              getMem(s, sl+1);
>              ZeroMemory(s, sl+1);
>              GetWindowText(ch,s,50);

тогда уж 50 уберите.


 
Dmitry S ©   (2008-04-20 22:38) [30]


>              ch := GetDlgItem (hWindow, id_edit);
>              sl := GetWindowTextLength(ch);
>              getMem(s, sl+1);
>              ZeroMemory(s, sl+1);
>              GetWindowText(ch,s,50);
>              s2:= s;
>              s2:=s2+"0";
>              s:=Pchar(s2);
>              SetWindowText(GetDlgItem (hWindow, id_edit),
> s);
>              freeMem(s)

ндаааа...

замени на
GetWindowText(ch,s,50);
SetWindowText(ch,PChar(s+"0"), sl+1);


 
Dmitry S ©   (2008-04-20 22:39) [31]

GetWindowText(ch,s,sl+1);
SetWindowText(ch,PChar(s+"0"), sl+1);


 
yahoo ©   (2008-04-20 22:45) [32]

хмм...спасибо ) чет сразу сам не  подумал ))...а есть справочник по WinApi для Delphi?


 
DVM ©   (2008-04-20 22:47) [33]


> а есть справочник по WinApi для Delphi?

msdn.microsoft.com


 
Dmitry S ©   (2008-04-20 22:48) [34]


> а есть справочник по WinApi для Delphi?

WinApi на то и WinApi, что он одинаковый для всех:)
А справочник находится в Help -> Windows SDK


 
yahoo ©   (2008-04-20 23:34) [35]

*ушел учить аглицкий*


 
Германн ©   (2008-04-21 02:07) [36]


> yahoo ©   (20.04.08 23:34) [35]
>
> *ушел учить аглицкий*
>

Поздравляю! Ты очень быстро схватываешь что именно нужно для программирования. Я серьезно.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.049 c
3-1197624704
novill
2007-12-14 12:31
2008.05.18
IB 7.5 Размер страницы.


15-1205425151
Real
2008-03-13 19:19
2008.05.18
Странности с ShowModal


11-1187366554
Vladimir Kladov
2007-08-17 20:02
2008.05.18
Версия 2.78


2-1208350222
Апостля
2008-04-16 16:50
2008.05.18
буфер. ричедит.


15-1207390437
@!!ex
2008-04-05 14:13
2008.05.18
Программирование под Mac OS X





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский