diff --git a/lcl/interfaces/win32/win32callback.inc b/lcl/interfaces/win32/win32callback.inc index 4d36f68b08..dd57974d17 100644 --- a/lcl/interfaces/win32/win32callback.inc +++ b/lcl/interfaces/win32/win32callback.inc @@ -34,7 +34,7 @@ end; Function PropEnumProc(Window: Hwnd; Str: PChar; Data: Handle): LongBool; StdCall; Begin Assert(False, 'Trace:PropEnumProc - Start'); - Assert(False, Format('Trace:PropEnumProc - Property %S (with value $%S) from window $%S removed', [String(Str), IntToHex(Integer(GetProp(Window, Str)), 4), IntToHex(Window, 4)])); + Assert(False, Format('Trace:PropEnumProc - Property %S (with value 0x%X) from window 0x%X removed', [String(Str), Data, Window])); RemoveProp(Window, Str); Result := True; Assert(False, 'Trace:PropEnumProc - Exit'); @@ -98,10 +98,15 @@ Begin End; WM_DESTROY: Begin + Assert(False, 'Trace:WindowProc - Got WM_DESTROY'); + ChangeClipboardChain(Window, OldClipboardViewer); For C := 0 To WndList.Count - 1 Do - EnumProps(HWND(WndList[C]^), @PropEnumProc); + EnumProps(HWND(WndList[C]), @PropEnumProc); PostQuitMessage(0); End; + WM_NOTIFY: + Begin + End; WM_MOVE: Begin LMessage.Msg := LM_MOVE; @@ -114,11 +119,15 @@ Begin LMessage.Msg := LM_SHOWWINDOW; TLMShowWindow(LMessage).Show := WParam <> 0; End; + WM_SIZE: + Begin + LMessage.Msg := LM_SIZE; + End; End; {$IFDEF VER1_1} List := TMsgArray(GetProp(Window, 'MsgList')); - If List <> Nil Then + If Pointer(List) <> Nil Then For C := 0 To Length(List) Do If List[C] = LMessage.Msg Then Begin @@ -1135,1076 +1144,6 @@ begin end; - Assert(False, Format('trace:' + -// WriteLN(Format( - '[GTKKeySnooper] Type %d, window $%x, send_event %d, time %d, state %d, keyval %d, length %d, string %s', - [ Integer(thetype), Integer(window), send_event, time, state, keyval, Event^.length, thestring]) - ); - end; - Result := 0; -end; - -{$IFDEF ASSERT_IS_ON} - {$UNDEF ASSERT_IS_ON} - {$C-} -{$ENDIF} - -{ $I Win32DragCallback.inc} - { - $Log$ - Revision 1.3 2002/01/05 13:16:08 lazarus - MG: win32 interface update from Keith Bowes - - Revision 1.2 2001/08/02 12:58:35 lazarus - MG: win32 interface patch from Keith Bowes - - Revision 1.1 2000/07/13 10:28:30 michael - + Initial import - - Revision 1.1 2000/03/30 22:53:37 lazarus - MWE: - Moved form ../.. - - Revision 1.2 1999/08/19 01:14:29 lazarus - Changed the clicked callback as a test. Someone help me out here... daworm@cdc.net - -} - -{$IFOPT C-} -// Uncomment for local trace -// {$C+} -// {$DEFINE ASSERT_IS_ON} -{$ENDIF} - - -// temp solution to fill msgqueue -function DeliverPostMessage(const Target: Pointer; var Message): Boolean; -begin -//writeln('delivermessage'); - if TObject(Target) is TWinControl - then begin - Result := PostMessage(TWinControl(Target).Handle, TLMessage(Message).Msg, TLMessage(Message).WParam, TLMessage(Message).LParam); - end - else begin - Result := DeliverMessage(Target, Message) = 0; - end; -end; - -procedure EventTrace(message : string; data : pointer); -begin - if Data = nil - then Assert(False, Format('Trace:Event [%s] fired',[message])) - else Assert(False, Format('Trace:Event [%s] fired for %s',[message, TObject(data).Classname])); -end; - -{*************************************************************} -{ callback routines } -{*************************************************************} - -function Win32showCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMShowWindow; -begin - Result := True; - EventTrace('show', data); - Mess.Msg := LM_SHOWWINDOW; - Mess.Show := True; - - Result := DeliverMessage(Data, Mess) = 0; - end; - -function Win32HideCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMShowWindow; -begin - Result := True; - EventTrace('hide', data); - Mess.Msg := LM_SHOWWINDOW; - Mess.Show := False; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32activateCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('activate', data); - Mess.Msg := LM_ACTIVATE; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32changedCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - Result := True; - EventTrace('changed', data); - - Mess.Msg := LM_CHANGED; - Result := DeliverMessage(Data, Mess) = 0; -end; - -Function Win32changed_editbox( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - Result := True; - EventTrace('changed', data); - - Mess.Msg := CM_TEXTCHANGED; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32draw( Win32Control: PWin32Control; area : TRect; data: wPointer) : Boolean; cdecl; -var - Mess: TLMPaint; -begin - Result := True; - EventTrace('draw', data); - Mess.Msg := LM_PAINT; - Mess.DC := GetDC(THandle(Win32Control)); - Mess.Unused := 0; - - Result := DeliverPostMessage(Data, Mess); -// Result := DeliverMessage(Data, MSG) = 0; -end; - -function Win32FrmActivate(Control: PWin32Control; Event : Integer {TgdkEventFocus}; data: wPointer) : Boolean; cdecl; -var - Mess : TLMActivate; -begin - EventTrace('activate', data); - Mess.Msg := LM_ACTIVATE; - Result := DeliverPostMessage(Data, Mess); -end; - -function Win32FrmDeactivate( Control: PWin32Control; Event : Integer {TgdkEventFocus}; data: wPointer) : Boolean; cdecl; -var - Mess : TLMActivate; -begin - EventTrace('deactivate', data); - Mess.Msg := LM_DEACTIVATE; - Result := DeliverPostMessage(Data, Mess); -end; - -function Win32Map(Control: PWin32Control; Data: wPointer): Boolean; cdecl; -var - Mess : TLMessage; -begin - Result := True; - EventTrace('map', data); -end; - -function Win32configureevent( Win32Control: PWin32Control; {!}{event : PgdkEventConfigure;} data: wPointer) : Boolean; cdecl; -var - MessI : Integer; - DC : HDC; - Win32Control2 : PWin32Control; - PenColor : TColor; -begin - EventTrace('', data); - MessI := LM_CONFIGUREEVENT; - - //Get the widget owner because the 'fixed' widget called the signal - //create a pixmap for drawing behind the scenes - - //assign it to the object data for this widget so it's stored there - //Clear the canvas area - - MessI := LM_REDRAW; //Should I be sending the Draw event?????????? - TObject(data).Dispatch(MessI); - Assert(False, 'Trace:Exiting Configure'); -end; - -function Win32exposeevent( Win32Control: PWin32Control; {!}{event : PgdkEventExpose;} data: wPointer) : Boolean; cdecl; -var - - msg: TLMPaint; -begin - Result := True; - EventTrace('expose-event', data); - - msg.msg := LM_PAINT; - MSG.DC := GetDC(THandle(Win32Control)); - msg.Unused := 0; - - Result := DeliverPostMessage(Data, MSG); - -// Result := DeliverMessage(Data, msg) = 0; - -end; - -function Win32keydown( Win32Control: PWin32Control; {!}{event : pgdkeventkey;} data: wPointer) : Boolean; cdecl; -var - MessI : TLMKeyEvent; - -begin - EventTrace('key down', data); - MessI.msg := LM_KEYDOWN; -{!}// MessI.State := event^.state; -{!}// MessI.Key := Event^.KeyVal; -{!}// MessI.Length := Event^.Length; -// MessI.Str := Event^.String; - MessI.UserData := data; - Result := DeliverMessage(Data, MessI) = 0; - // TObject(data).Dispatch(MessI); -end; - -function Win32keyup( Win32Control: PWin32Control; {!}{event : pgdkEventKey;} data: wPointer) : Boolean; cdecl; -var - MessI : TLMKeyEvent; - -begin - EventTrace('Key Up', data); - MessI.msg := LM_KEYUP; -{!}// MessI.State := event^.state; -{!}// MessI.Key := Event^.KeyVal; -{!}// MessI.Length := Event^.Length; -// MessI.Str := Event^.String; - MessI.UserData := data; - - Result := DeliverMessage(Data, MessI) = 0; - // TObject(data).Dispatch(MessI); - end; - -function Win32KeyUpDown(Win32Control: PWin32Control; Event : PWin32KeyEvent; Data: Pointer) : Boolean; cdecl; -var - Msg: TLMKey; - KeyCode: Word; - Flags: Integer; - Toggle, Extended, SysKey: Boolean; -begin - GetWin32KeyInfo(Event, KeyCode, Msg.CharCode, SysKey, Extended, Toggle); -// Assert(False, Format('Trace:[GTKKeyUpDown] Type: %3:d, GTK: 0x%0:x(%0:d) LCL: 0x%1:x(%1:d) VK: 0x%2:x(%2:d)', [Event^.keyval, KeyCode, Msg.CharCode, Event^.theType])); - - Flags := 0; - - if Extended then Flags := KF_EXTENDED; - if SysKey then Flags := Flags or KF_ALTDOWN; - - - Msg.KeyData := $00000000; //TODO: OEM char - - // TODO: Get Win32 constants set up. - case Event^.theType of - - WIN32_KEY_RELEASE: // Key up - begin - EventTrace('key up', data); - if SysKey - then Msg.msg := LM_SYSKEYUP - else Msg.msg := LM_KEYUP; - - Flags := Flags or KF_UP or KF_REPEAT; - - Msg.KeyData := Msg.KeyData or (Flags shl 16) or $0001 {allways}; - Result := DeliverPostMessage(data, msg); - - end; - WIN32_KEY_PRESS: // Key press - begin - EventTrace('key down', data); - if SysKey - then Msg.msg := LM_SYSKEYDOWN - else Msg.msg := LM_KEYDOWN; - - // todo repeat - // Flags := Flags or KF_REPEAT; - - Msg.KeyData := Msg.KeyData or (Flags shl 16) or $0001 {TODO: repeatcount}; - Result := DeliverPostMessage(data, msg); - - if KeyCode <> $FFFF - then begin - EventTrace('char', data); - if SysKey then Msg.msg := LM_SYSCHAR - else Msg.msg := LM_CHAR; - Msg.CharCode := KeyCode; - Result := DeliverPostMessage(data, msg); - end; - end; - end; -end; - -function Win32focusCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -Var - Mess : TLMessage; -begin - EventTrace('focus', data); -// Writeln('Getting Focus...'); - //TODO: fill in old focus - Mess.msg := LM_SETFOCUS; - Assert(False, Format('Trace:TODO: [gtkfocusCB] %s finish', [TObject(Data).ClassName])); - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32KillFocusCB( Control: PWin32Control; event: Pointer {PGdkEventFocus}; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('killfocus', data); -// Writeln('Killing Focus...'); - Mess.msg := LM_KILLFOCUS; - //TODO: fill in new focus - Assert(False, Format('Trace:TODO: [gtkkillfocusCB] %s finish', [TObject(Data).ClassName])); - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32destroyCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess: TLMessage; - Info: PWinControlInfo; -begin - Result := True; - EventTrace('destroy', data); - Mess.msg := LM_DESTROY; - Result := DeliverMessage(Data, Mess) = 0; - - // NOTE: if the destroy message is posted - // we should post a info destroy message as well - Info := GetControlInfo(Win32Control, False); - if Info <> nil then Dispose(Info); -end; - -function Win32deleteCB( Control: PWin32Control; event : Pointer {PGdkEvent}; data : wPointer) : Boolean; cdecl; -var Mess : TLMessage; -begin - Mess.Msg:= LM_CLOSEQUERY; - { Message results : True - do nothing, False - destroy or hide window } - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32resizeCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; - -begin - EventTrace('resize', data); - Mess.Msg := LM_SIZE; - Result := DeliverMessage(Data, Mess) = 0; - // TObject(data).Dispatch(MessI); -end; - -// Commenting out until Win32 code for tracking motion is done. -{function GTKMotionNotify(widget:PGTKWidget; event: PGDKEventMotion; data: gPointer):GBoolean; cdecl; -var - Msg: TLMMouseMove; - ShiftState: TShiftState; -begin - - - ShiftState := GTKEventState2ShiftState(Event^.State); - with Msg do - begin - Msg := LM_MouseMove; - XPos := Round(Event^.X); - YPos := Round(Event^.Y); -// XPos := Trunc(Event^.X); -// YPos := trunc(Event^.Y); -{ Writeln('MOUSEMOVE Signal'); - Writeln('X = '); - Writeln(' '+inttostr(XPos)); - Writeln('Y = '); - Writeln(' '+inttostr(YPos)); - Writeln('X_root = '); - Writeln(' '+inttostr(round(Event^.X_Root))); - Writeln('Y_root = '); - Writeln(' '+inttostr(round(Event^.Y_Root))); - writeln('widget is ='+inttostr(longint(widget))); - if (TObject(data) is TCOntrol) then - writeln('Control is ='+TControl(data).classname); - Writeln('------------------'); - } - Keys := 0; - if ssShift in ShiftState then Keys := Keys or MK_SHIFT; - if ssCtrl in ShiftState then Keys := Keys or MK_CONTROL; - if ssLeft in ShiftState then Keys := Keys or MK_LBUTTON; - if ssRight in ShiftState then Keys := Keys or MK_RBUTTON; - if ssMiddle in ShiftState then Keys := Keys or MK_MBUTTON; - end; - Result := DeliverPostMessage(Data, Msg); - - //if ssLeft in ShiftState then WriteLN(Format('[GTKMotionNotify] widget: 0x%p', [widget])); - - if (Pointer(MCaptureHandle) <> widget) - and (MCaptureHandle <> 0) - then WriteLN(Format('[GTKMotionNotify] Capture differs --> cap:0x%x gtk:0x%p', [MCaptureHandle, gtk_grab_get_current])); -end;} - -function Win32MouseBtnPress( Win32Control: PWin32Control; {!}{event : pgdkEventButton;} data: wPointer) : Boolean; cdecl; -var - MessI : TLMMouseEvent; -begin - EventTrace('Mouse button Press', data); - MessI.Msg := LM_LBUTTONDOWN; - MessI.Button := -1; - MessI.WheelDelta:= 0; -{!}// MessI.State := Event^.State; -{!}// MessI.X := Trunc(Event^.X); -{!}// MessI.Y := trunc(Event^.Y); - MessI.UserData := Data; -{!}// case event^.Button of -{!}// 1 : -{!}// MessI.Button := 0; -{!}// 2 : -{!}// MessI.Button := 2; -{!}// 3 : -{!}// MessI.Button := 1; -{!}// 4 : -{!}// begin -{!}// MessI.Msg := LM_MOUSEWHEEL; -{!}// MessI.WheelDelta:=1; -{!}// end; -{!}// 5 : -{!}// begin -{!}// MessI.Msg := LM_MOUSEWHEEL; -{!}// MessI.WheelDelta:=-1; -{!}// end; -{!}// end; - TObject(data).Dispatch(MessI); -end; - -function Win32MouseBtnRelease( Win32Control: PWin32Control; {!}{event : pgdkEventButton;} data: wPointer) : Boolean; cdecl; -var - MessI : TLMMouseEvent; - -begin - EventTrace('Mouse button release', data); - MessI.Msg := LM_LBUTTONUP; - MessI.Button := -1; - MessI.WheelDelta:= 0; -{!}// MessI.State := Event^.State; -{!}// MessI.X := Trunc(Event^.X); -{!}// MessI.Y := trunc(Event^.Y); - MessI.UserData := Data; -{!}// case event^.Button of -{!}// 1 : -{!}// MessI.Button := 0; -{!}// 2 : -{!}// MessI.Button := 2; -{!}// 3 : -{!}// MessI.Button := 1; -{!}// end; - TObject(data).Dispatch(MessI); -end; - -function Win32clickedCB( OwnerObject: Pointer; AMessage, wParam, lParam: LongInt) : Boolean; cdecl; -var - MessI : Integer; - -begin - Assert(False, 'Trace:Callback Function - Win32clickedCB'); - EventTrace('clicked', OwnerObject); - MessI := LM_CLICKED; - TObject(OwnerObject).Dispatch(MessI); -end; - -function Win32DialogOKclickedCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -Type - TCustomColors = Array[1..16] Of COLORREF; -var - theDialog : TCommonDialog; - Fpointer : Pointer; - colorArray : array[0..2] of double; - colorsel : TChooseColor; - newColor : COLORREF; - FontName : String; - OpenFile: OpenFileName; - CustomColors: TCustomColors; - RGBIO: DWORD; - FontSel: TChooseFont; - LF: TLogFont; - Col: TGDIRGB; -Const - Filter: PChar = 'All Files'#0'*.*'#0#0; -begin - Result := True; - theDialog := TCommonDialog(data); - FPointer := Pointer(theDialog.Handle); - if theDialog is TFileDialog then - begin - ZeroMemory(@OpenFile, SizeOf(OpenFile)); - With OpenFile Do - Begin - LStructSize := SizeOf(OpenFile); - HWNDOwner := Win32Control^.Window; - LPStrFilter := Filter; - NMaxFile := MAX_PATH; - Flags := OFN_Explorer Or OFN_AllowMultiSelect Or OFN_CreatePrompt Or OFN_HideReadOnly Or OFN_OverwritePrompt; - End; - - If Not GetOpenFileName(@OpenFile) Then - Assert(False, 'ERROR: [Win32DialogOKclickedCB] got unopenable file'); - TFileDialog(data).FileName := OpenFile.LPStrFile; - end - else if theDialog is TColorDialog then - begin - ZeroMemory(@colorsel, SizeOf(colorsel)); - With colorsel Do - Begin - LStructSize := SizeOf(colorsel); - HWNDOwner := Win32Control^.Window; - RGBResult := RGBIO; - LPCustColors := LPDWORD(@CustomColors); - Flags := CC_FULLOPEN Or CC_RGBINIT; - End; - If Not ChooseColor(@colorsel) Then - Assert(False, 'ERROR: [Win32DialogOKclickedCB] got invalid color'); - Col.red := GetRValue(colorsel.RGBResult); - Col.green := GetGValue(colorsel.RGBResult); - Col.blue := GetBValue(colorsel.RGBResult); - - TColorDialog(theDialog).Color := TColor(Col); - end - else if theDialog is TFontDialog then - begin - Assert(False, 'Trace:Prssed OK in FontDialog'); - ZeroMemory(@FontSel, SizeOf(FontSel)); - With FontSel Do - Begin - LStructSize := SizeOf(FontSel); - HWNDOwner := Win32Control^.Window; - LPLogFont := @LF; - Flags := CF_InitToLogFontStruct Or CF_ScreenFonts Or CF_Effects Or CF_ForceFontExist; - End; - - // FontName := gtk_font_selection_dialog_get_font_name(pgtkfontselectiondialog(FPointer)); - TFontDialog(theDialog).FontName := FontSel.LPLogFont^.LFFaceName; - Assert(False, 'Trace:-----'+TFontDialog(theDialog).FontName+'----'); - end; - { -// gtk_grab_remove(PgtkWidget(TCommonDialog(data).Handle)); - if theDialog is TFileDialog then - begin - TFileDialog(data).FileName := gtk_file_selection_get_filename(PGtkFileSelection(FPointer)); - end - else if theDialog is TColorDialog then - begin - colorSel := GTK_COLOR_SELECTION((GTK_COLOR_SELECTION_DIALOG(FPointer))^.colorsel); - gtk_color_selection_get_color(colorsel, @colorArray[0]); - newColor.pixel := 0; - newColor.red := Trunc(colorArray[0] * $FFFF); - newColor.green := Trunc(colorArray[1] * $FFFF); - newColor.blue := Trunc(colorArray[2] * $FFFF); - - TColorDialog(theDialog).Color := TGDKColorToTColor(newcolor); - end - else if theDialog is TFontDialog then - begin - Assert(False, 'Trace:Prssed OK in FontDialog'); - FontName := gtk_font_selection_dialog_get_font_name(pgtkfontselectiondialog(FPointer)); - TFontDialog(theDialog).FontName := FontName; - Assert(False, 'Trace:-----'+TFontDialog(theDialog).FontName+'----'); - end;} - - theDialog.UserChoice := mrOK; -end; - -function Win32DialogCancelclickedCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - theDialog : TCommonDialog; -begin - Result := True; - theDialog := TCommonDialog(data); - if theDialog is TFileDialog then - begin - TFileDialog(data).FileName := ''; - end; - theDialog.UserChoice := mrCancel; -end; - -function Win32DialogDestroyCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - theDialog : TCommonDialog; -begin - Result := True; - theDialog := TCommonDialog(data); -// gtk_grab_remove(PgtkWidget(TCommonDialog(data).Handle)); - { if theDialog is TFileDialog then - begin - TFileDialog(data).FileName := ''; - end; -} - theDialog.UserChoice := -1; -end; - -function Win32pressedCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - Result := True; - EventTrace('pressed', data); - Mess.msg := LM_PRESSED; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32enterCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - Result := True; - EventTrace('enter', data); - Mess.msg := LM_ENTER; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32leaveCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - Result := True; - EventTrace('leave', data); - Mess.msg := LM_LEAVE; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32movecursorCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - Result := True; - EventTrace('move-cursor', data); - Mess.msg := LM_MOVECURSOR; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32size_allocateCB( Win32Control: PWin32Control; {!}{size :pGtkAllocation;} data: wPointer) : Boolean; cdecl; -var -MessI : Integer; -msg : TLMResize; -begin - EventTrace('size-allocate', data); - MessI := LM_WINDOWPOSCHANGED; - msg.msg := MessI; -{!}// Msg.Left := Size^.X; -{!}// Msg.Top := Size^.Y; -{!}// Msg.Width := Size^.width; -{!}// Msg.Height := Size^.height; - Msg.Userdata := Data; - TObject(data).Dispatch(msg); -end; - -function Win32switchpage(Control: PWin32Control; page: PWin32Control; pagenum : integer; data: wPointer) : Boolean; cdecl; -var - Mess : TLMNotify; - T : tagNMHDR; -begin - Result := True; - EventTrace('switch-page', data); - Mess.Msg := LM_NOTIFY; - //this is the - T.code := TCN_SELCHANGE;//(0-550)-1; - T.hwndfrom := longint(Control); - T.idfrom := pagenum; //use this to set pageindex to the correct page. - Mess.NMHdr := @T; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32releasedCB( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMEssage; -begin - Result := True; - EventTrace('released', data); - Mess.msg := LM_RELEASED; - Result := DeliverMessage(Data, Mess) = 0; -end; - -function Win32InsertText( Win32Control: PWin32Control; char : pChar; NewTextLength : Integer; {!}{Position : pgint;} data: wPointer) : Boolean; cdecl; -var - MessI : Integer; - Msg : TLMInsertText; - I : Integer; -begin - EventTrace('Insert Text', data); - MessI := LM_INSERTTEXT; - - Msg.Msg := MessI; - Msg.NewText := ''; - For I := 1 to NewTextLength do - Msg.NewText := Msg.Newtext+Char[i-1]; -// Msg.NewText := String(Char); - Msg.Length := NewTextLength; -{!}// Msg.Position := Position^; - Msg.Userdata := data; - Result := DeliverMessage(Data, Msg) = 0; -end; - -function Win32DeleteText( Win32Control: PWin32Control; Startpos, EndPos : Integer; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Delete Text', data); - Mess.msg := LM_DELETETEXT; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32SetEditable( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Set Editable', data); - Mess.msg := LM_SETEDITABLE; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32MoveWord( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Move Word', data); - Mess.msg := LM_MOVEWORD; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32MovePAge( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Move Page', data); - Mess.msg := LM_MOVEPAGE; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32MoveToRow( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Move To Row!!', data); - Mess.msg := LM_MOVETOROW; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32MoveToColumn( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('MoveToColumn', data); - Mess.msg := LM_MOVETOCOLUMN; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32KillChar( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Kill Char', data); - Mess.msg := LM_KILLCHAR; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32KillWord( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Kill Word', data); - Mess.msg := LM_KILLWORD; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32KillLine( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Kill Line', data); - Mess.msg := LM_KILLLINE; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32CutToClip( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Cut to clip', data); - Mess.msg := LM_CUTTOCLIP; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32CopyToClip( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Copy to Clip', data); - Mess.msg := LM_COPYTOCLIP; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32PasteFromClip( Win32Control: PWin32Control; data: wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Paste from clip', data); - Mess.msg := LM_PASTEFROMCLIP; - Result:= DeliverMessage(Data, Mess) = 0; -end; - -function Win32MoveResize( Win32Control: PWin32Control; X, Y, Width, Height : PInteger; data: wPointer) : Boolean; cdecl; -var -MessI : Integer; -msg : TLMResize; -begin - EventTrace('size-allocate', data); - MessI := LM_USER + 29 {LM_MOVERESIZE}; - msg.msg := MessI; -{!}// Msg.Left := X^; -{!}// Msg.Top := Y^; -{!}// Msg.Width := Width^; -{!}// Msg.Height := Height^; - Msg.Userdata := Data; - - TObject(data).Dispatch(msg); -end; - -function Win32valuechanged ( Control: PWin32Control; data : wPointer) : Boolean; cdecl; -var - Mess : TLMessage; -begin - EventTrace('Value changed', data); - Mess.msg := LM_CHANGED; - Result := DeliverMessage(Data, Mess) = 0; -end; - -{ - Directly call the Timer function of the TTimer object. - (As far as I know this can't be dispatched like it's done in the other callbacks!) -} -function Win32TimerCB (data : wPointer) : Integer; cdecl; -var - P : ^TTimer; -begin - EventTrace('timer', data); - P := @data; - {$IFDEF VER1_1} - P^.Timer(TTimer(data)); - {$ELSE} - Assert(False, 'TRACE: Cannot dispatch timer in Win32TimerCB'); - {$ENDIF} - result := 1; { returning 0 would stop the timer, 1 will restart it } -end; - -function Win32FocusInNotifyCB (Control: PWin32Control; event : Pointer {PGdkEvent}; data : wpointer) : Boolean; cdecl; -var - MessI : TLMEnter; -begin - EventTrace ('FocusInNotify (alias Enter)', data); - MessI.msg := LM_Enter; - Result:= DeliverMessage(Data, MessI) = 0; -end; - -function Win32FocusOutNotifyCB (Control: PWin32Control; event : Pointer {PGdkEvent}; data : wpointer) : Boolean; cdecl; -var - MessI : TLMExit; -begin - EventTrace ('FocusOutNotify (alias Exit)', data); - MessI.msg := LM_Exit; - Result:= DeliverMessage(Data, MessI) = 0; -end; - -{ - Msg : Cardinal; - ScrollCode : SmallInt; - Pos : SmallInt; - ScrollBar : HWND; - Result : LongInt; -} - -function Win32HScrollCB(Scroll: PHandle; data: wPointer): Boolean; cdecl; -var - Msg: TLMHScroll; - OldValue, - V, U, L, - StepI, PageI, Page: Integer; - //Scroll: PGTKHScrollBar; - X, Y: Integer {GInt}; - Mask: Handle {TGdkModifierType}; - SI: TAGSCROLLINFO; - R: Windows.RECT; -begin - //Assert(False, Format('Trace:[GTKHScrollCB] Value: %d', [Round(Adjustment^.Value)])); - - ZeroMemory(@SI, SizeOf(SI)); - With SI Do - Begin - CBSize := SizeOf(SCROLLINFO); - FMask := SIF_PAGE Or SIF_POS Or SIF_RANGE Or SIF_TRACKPOS; - GetScrollInfo(Scroll^, SB_CTL, SI); - OldValue := nPos; - L := nMin; - U := nMax; - StepI := nPos; - PageI := nTrackPos; - Page := nPage; - End; - - {OldValue := Integer(gtk_object_get_data(PGTKObject(Adjustment), 'OldValue')); - gtk_object_set_data(PGTKObject(Adjustment), 'OldValue', Pointer(Round(Adjustment^.Value))); - Scroll := gtk_object_get_data(PGTKObject(Adjustment), 'ScrollBar'); - - // Get rounded values - with Adjustment^ do - begin - V := Round(Value); - U := Round(Upper); - L := Round(Lower); - StepI := Round(Step_Increment); - PageI := Round(Page_Increment); - Page := Round(Page_Size); - end;} - - // get keystates - if Scroll <> nil - then //gdk_window_get_pointer(PGTKWidget(Scroll)^.Window, @X, @Y, @Mask); - Windows.GetClientRect(Scroll^, @R); - X := R.Right - R.Left; - Y := R.Top - R.Bottom; - - with Msg do - begin - msg := LM_HSCROLL; - // Get scrollcode - //if ssLeft in GTKEventState2ShiftState(Mask) - if StepI - U >= 0 - then ScrollCode := SB_THUMBTRACK - else if V - OldValue = StepI - then ScrollCode := SB_LINERIGHT - else if OldValue - V = StepI - then ScrollCode := SB_LINELEFT - else if V - OldValue = PageI - then ScrollCode := SB_PAGERIGHT - else if OldValue - V = PageI - then ScrollCode := SB_PAGELEFT - else if V >= U - then ScrollCode := SB_ENDSCROLL - else ScrollCode := SB_THUMBPOSITION; - Pos := V; - ScrollBar := HWND(Scroll^); - end; - Result := DeliverMessage(Data, Msg) = 0; -end; - -function Win32VScrollCB(Scroll: PHandle; data: wPointer): Boolean; cdecl; -var - Msg: TLMVScroll; - OldValue, - V, U, L, - StepI, PageI, Page: Integer; - //Scroll: PGTKHScrollBar; - X, Y: Integer {GInt}; - Mask: Integer {TGdkModifierType}; - SI: TAGSCROLLINFO; - R: Windows.RECT; -begin - //Assert(False, Format('Trace:[GTKVScrollCB] Value: %d', [Round(Adjustment^.Value)])); - - ZeroMemory(@SI, SizeOf(SI)); - With SI Do - Begin - CBSize := SizeOf(SCROLLINFO); - FMask := SIF_PAGE Or SIF_POS Or SIF_RANGE Or SIF_TRACKPOS; - GetScrollInfo(Scroll^, SB_CTL, SI); - OldValue := nPos; - L := nMin; - U := nMax; - StepI := nPos; - PageI := nTrackPos; - Page := nPage; - End; - - {OldValue := Integer(gtk_object_get_data(PGTKObject(Adjustment), 'OldValue')); - gtk_object_set_data(PGTKObject(Adjustment), 'OldValue', Pointer(Round(Adjustment^.Value))); - Scroll := gtk_object_get_data(PGTKObject(Adjustment), 'ScrollBar'); - - // Get rounded values - with Adjustment^ do - begin - V := Round(Value); - U := Round(Upper); - L := Round(Lower); - StepI := Round(Step_Increment); - PageI := Round(Page_Increment); - Page := Round(Page_Size); - end;} - - // get keystates - if Scroll <> nil - then //gdk_window_get_pointer(PGTKWidget(Scroll)^.Window, @X, @Y, @Mask); - Windows.GetClientRect(Scroll^, @R); - X := R.Right - R.Left; - Y := R.Top - R.Bottom; - - with Msg do - begin - msg := LM_VSCROLL; - // Get scrollcode - //if ssLeft in GTKEventState2ShiftState(Mask) - if StepI - U >= 0 - then ScrollCode := SB_THUMBTRACK - else if V - OldValue = StepI - then ScrollCode := SB_LINERIGHT - else if OldValue - V = StepI - then ScrollCode := SB_LINELEFT - else if V - OldValue = PageI - then ScrollCode := SB_PAGERIGHT - else if OldValue - V = PageI - then ScrollCode := SB_PAGELEFT - else if V >= U - then ScrollCode := SB_ENDSCROLL - else ScrollCode := SB_THUMBPOSITION; - Pos := V; - ScrollBar := HWND(Scroll^); - end; - Result := DeliverMessage(Data, Msg) = 0; -end; - -{------------------------------------------------------------------------------ - Function: GTKKeySnooper - Params: Widget: The widget for which this event is fired - Event: The keyevent data - FuncData: the user parameter passed when the snooper was installed - Returns: True if other snoopers shouldn't handled - - Keeps track of which keys are pressed. The keycode is casted to a pointer and - if it exists in the KeyStateList, it is pressed. - ------------------------------------------------------------------------------} -function Win32KeySnooper(Win32Control: PWin32Control; Event: PWin32KeyEvent; FuncData: wPointer): Int; cdecl; -type - PList = ^TList; -var - Msg: TLMKey; - KeyCode, VirtKeyCode: Word; - ListCode: Integer; - Toggle, Extended, SysKey: Boolean; -begin - GetWin32KeyInfo(Event, KeyCode, VirtKeyCode, SysKey, Extended, Toggle); - with Event^ do - begin - if VirtKeyCode = VK_UNKNOWN - then ListCode := KEYMAP_VKUNKNOWN and KeyCode - else ListCode := VirtKeyCode; - if Extended then ListCode := ListCode or KEYMAP_EXTENDED; - - case theType of - WIN32_KEY_PRESS: - begin - if PList(FuncData)^.IndexOf(Pointer(ListCode)) = -1 - then begin - PList(FuncData)^.Add(Pointer(ListCode)); - if Toggle then PList(FuncData)^.Add(Pointer(ListCode or KEYMAP_TOGGLE)); - end - else WriteLn(Format('WARNING: [GTKKeySnooper] Pressed key (0x%x) already pressed (LC=0x%x)', [KeyCode, ListCode])); - end; - WIN32_KEY_RELEASE: - begin - if PList(FuncData)^.Remove(Pointer(ListCode)) = -1 - then WriteLn(Format('WARNING: [GTKKeySnooper] Released key (0x%x) not pressed (LC=0x%x)', [KeyCode, ListCode])); - // just remove the togglekey if present - if not Toggle then PList(FuncData)^.Remove(Pointer(ListCode or KEYMAP_TOGGLE)); - end; - else - WriteLn(Format('ERROR: [GTKKeySnooper] Got unknown event %d', [Integer(theType)])); - end; - - Assert(False, Format('trace:' + // WriteLN(Format( '[GTKKeySnooper] Type %d, window $%x, send_event %d, time %d, state %d, keyval %d, length %d, string %s', @@ -2220,8 +1159,12 @@ end;} {$ENDIF} { $I Win32DragCallback.inc} + { $Log$ + Revision 1.4 2002/01/17 03:17:44 lazarus + Keith: Fixed TPage creation + Revision 1.3 2002/01/05 13:16:08 lazarus MG: win32 interface update from Keith Bowes @@ -2230,4 +1173,4 @@ end;} Revision 1.1 2000/07/13 10:28:30 michael + Initial import -} \ No newline at end of file +} diff --git a/lcl/interfaces/win32/win32int.pp b/lcl/interfaces/win32/win32int.pp index 1f28a93816..e9bec15bd4 100644 --- a/lcl/interfaces/win32/win32int.pp +++ b/lcl/interfaces/win32/win32int.pp @@ -43,7 +43,7 @@ Var FormClassName: PChar; Const - ClsName = 'MainWinClass'; + ClsName = 'LazarusForm'; Type { Virtual alignment-control record } @@ -65,7 +65,7 @@ Type FMessageQueue: TList; FToolTipWindow: HWND; FAccelGroup: HACCEL; - FTimerData : TList; // Keeps track of timer event structures + FTimerData: TList; // Keeps track of timer event structures FAlignment: TAlignment; // Tracks alignment FControlIndex: Cardinal; // Win32-API control index @@ -88,7 +88,7 @@ Type Procedure CreateComponent(Sender: TObject); Procedure AddChild(Parent, Child: HWND; Left, Top: Integer); - Procedure ResizeChild(Sender: TObject; Left, Top, Width, Height: Integer); + Procedure ResizeChild(Window: HWND; Left, Top, Width, Height: Integer); Function GetLabel(CompStyle: Integer; Window: HWnd): String; Procedure AssignSelf(Window: HWnd; Data: Pointer); Procedure ReDraw(Child: TObject); @@ -111,8 +111,8 @@ Type Procedure SetColor(Sender : TObject); Procedure SetPixel(Sender: TObject; Data: Pointer); Procedure GetPixel(Sender: TObject; Data: Pointer); - Function GetValue (Sender: TObject; Data: pointer): Integer; - Function SetValue (Sender: TObject; Data: pointer): Integer; + Function GetValue (Sender: TObject; Data: Pointer): Integer; + Function SetValue (Sender: TObject; Data: Pointer): Integer; Function SetProperties (Sender: TObject): Integer; Procedure AttachMenu(Sender: TObject); @@ -129,6 +129,7 @@ Type Procedure DrawText(Child: TObject; Data: Pointer); Procedure PaintPixmap(Surface: TObject; PixmapData: Pointer); Procedure NormalizeIconName(Var IconName: String); + Procedure NormalizeIconName(Var IconName: PChar); Procedure CreateCommonDialog(Sender: TObject); Public { Constructor of the class } @@ -155,7 +156,7 @@ Type Procedure DoEvents; Override; { Handle all events (Window messages) } Procedure HandleEvents; Override; - { Halt until a message is received } + { Wait until a message is received } Procedure WaitMessage; Override; { Abruptly halt execution of the program } Procedure AppTerminate; Override; @@ -242,9 +243,7 @@ Type WParam: WPARAM; Win32Control: PWin32Control; Event: Pointer; - Draw: Record - X, Y: Integer; - End; + Draw: TPoint; ExtData: Pointer; Reserved: Pointer; End; @@ -326,6 +325,9 @@ End. { ============================================================================= $Log$ + Revision 1.6 2002/01/17 03:17:44 lazarus + Keith: Fixed TPage creation + Revision 1.5 2002/01/05 13:16:09 lazarus MG: win32 interface update from Keith Bowes diff --git a/lcl/interfaces/win32/win32listsl.inc b/lcl/interfaces/win32/win32listsl.inc index 3ce212e869..f9cbcede14 100644 --- a/lcl/interfaces/win32/win32listsl.inc +++ b/lcl/interfaces/win32/win32listsl.inc @@ -19,8 +19,8 @@ Function DefaultCompareFunc(A, B: HWND): Integer; CDecl; Var AStr, BStr: PChar; Begin - GetWindowText(A, AStr, GetWindowTextLength(A) + 1); - GetWindowText(B, BStr, GetWindowTextLength(B) + 1); + GetWindowText(A, @AStr, GetWindowTextLength(A) + 1); + GetWindowText(B, @BStr, GetWindowTextLength(B) + 1); Result := StrComp(AStr, BStr); end; @@ -106,7 +106,7 @@ Begin Raise Exception.Create('Out of bounds.') Else Begin - SendMessage(FWin32List, CB_GETLBTEXT, Index, LPARAM(Item)); + SendMessage(FWin32List, CB_GETLBTEXT, Index, LPARAM(@Item)); End; Result := StrPas(Item); End; @@ -262,7 +262,7 @@ Begin Raise Exception.Create('Out of bounds.') Else Begin - SendMessage(FWin32CList, CB_GETLBTEXT, Index, LPARAM(Item)); + SendMessage(FWin32CList, CB_GETLBTEXT, Index, LPARAM(@Item)); Result := StrPas(Item); End; End; @@ -329,8 +329,10 @@ End; { ============================================================================= $Log$ + Revision 1.2 2002/01/17 03:17:44 lazarus + Keith: Fixed TPage creation + Revision 1.1 2002/01/06 23:09:52 lazarus MG: added missing files - } diff --git a/lcl/interfaces/win32/win32object.inc b/lcl/interfaces/win32/win32object.inc index 04b5c215ed..4b8846c9d0 100644 --- a/lcl/interfaces/win32/win32object.inc +++ b/lcl/interfaces/win32/win32object.inc @@ -103,28 +103,29 @@ Var Ctrl: TNotebook; TCI: TC_ITEM; Begin - Assert(False, 'Trace:TWin32Object.GetText - Start'); + Assert(False, Format('Trace:TWin32Object.GetText - Start --> %S', [Sender.ClassName])); Data := ''; Result := True; Case Sender.FCompStyle Of csComboBox, csEdit, csMemo: Begin CapLen := GetWindowTextLength((Sender As TWinControl).Handle); - GetWindowText((Sender As TWinControl).Handle, Caption, CapLen + 1); + GetWindowText((Sender As TWinControl).Handle, @Caption, CapLen + 1); + Data := StrPas(PChar(@Caption)); End; csPage: Begin Assert(False, 'Trace:TWin32Object.GetText - csPage: Start'); - Ctrl := (TNotebook(Sender)); + Ctrl := ((Sender As TPage).Parent As TNotebook); Try Assert(False, 'Trace:TWin32Object.GetText - Filling TC_ITEM'); TCI.mask := TCIF_TEXT; TCI.cchTextMax := MAX_PATH; TCI.pszText := StrAlloc(MAX_PATH); Assert(False, 'Trace:TWin32Object.GetText - Getting the text'); - TabCtrl_GetItem(Ctrl.Handle, PLMNotebookEvent(@Sender)^.Page, TCI); - Assert(False, 'Trace:TWin32Object.GetText - Returning the text'); + TabCtrl_GetItem(Ctrl.Handle, Ctrl.PageIndex, TCI); Data := String(TCI.pszText); + Assert(False, Format('Trace:TWin32Object.GetText - Returning the text --> %S', [Data])); Except StrDispose(TCI.pszText); End; @@ -133,7 +134,7 @@ Begin Else Result := False; End; - Data := StrPas(Caption); + // Result := Data <> ''; End; {------------------------------------------------------------------------------ @@ -358,7 +359,7 @@ Begin LM_SETPROPERTIES: Result := SetProperties(Sender); LM_SETDESIGNING: - EnableWindow(Handle, False); + EnableWindow((Sender As TWinControl).Handle, False); LM_RECREATEWND: Result := RecreateWnd(Sender); LM_ATTACHMENU: @@ -1492,6 +1493,7 @@ Begin If (Sender Is TWinControl) And ((Sender As TWinControl).Parent <> Nil) Then Begin + Assert(False, Format('Trace: %S parent --> %S', [Sender.ClassName, TWinControl(Sender).Parent.ClassName])); Parent := (Sender As TWinControl).Parent.Handle; Assert(False, 'Trace:Setting parent'); End @@ -1582,7 +1584,7 @@ Begin Assert(False, 'Trace:CreateComponent - Button Window Handle Value = $' + IntToHex(Window, 8)); Assert(False, 'Trace:CreateComponent - Creating a Button - SetProp'); If Window <> HWND(Nil) Then - SetProp(Window, 'Lazarus', @Sender); + SetProp(Window, 'Lazarus', Sender); SetName(Window, StrTemp); End; csCalendar: @@ -1614,10 +1616,12 @@ Begin End; csImage: Begin + DC := GetDC(Handle); With TImage(Sender).Picture.Bitmap Do Window := CreateBitmap(Width, Height, GetDeviceCaps(DC, PLANES), BitsPerPixel[Monochrome], Nil); SetOwner(Window, Sender); SetName(Window, StrTemp); + ReleaseDC(Handle, DC); End; csListBox: Begin @@ -1673,13 +1677,13 @@ Begin Window := CreateWindow(ClsName, StrTemp, WS_OVERLAPPEDWINDOW, Left, Top, Width, Height, Parent, HMENU(Nil), HInstance, Nil); If Sender Is TForm Then OldClipboardViewer := SetClipboardViewer(Window); - If FMainForm = Nil Then + If (FMainForm = Nil) And (Application.MainForm = Nil) Then FMainForm := TForm(Sender); FParentWindow := Window; Assert(False, 'Trace:CreateComponent - Form Window Handle Value = $' + IntToHex(Window, 8)); Assert(False, 'Trace:Creating a Form - SetProp'); //SetProp(Window, 'Lazarus', @Sender); - SetProp(Window, 'Lazarus', Pointer(Sender)); + SetProp(Window, 'Lazarus', Sender); If Window = 0 then Begin MessageBox(0, 'csForm CreateWindow Failed', nil, mb_Ok); @@ -1862,30 +1866,48 @@ Begin // TPage - Notebook page csPage: Begin - Assert(False, 'Trace:TODO:Create a csPage component.'); + Assert(False, 'Trace:TODO: Create a csPage component.'); Assert(False, 'Trace:Going to try it here. I''m guaranteeing nothing.'); - With TCI Do - Begin - Mask := TCIF_TEXT; - PSzText := StrTemp; - End; Assert(False, 'Trace:csPage - class name is ' + Sender.ClassName); - //Assert(False, Format('Trace:[TWin32Object.CreateComponent] csPage: Tab index=%D', [PLMNotebookEvent(@Sender)^.Page])); - Try - Window := TabCtrl_InsertItem((Sender As TWinControl).Parent.Handle, PLMNotebookEvent(@Sender)^.Page, TCI); - Except - Assert(False, 'Trace:csPage - Could not insert page'); - Exit; + With ((Sender As TPage).Parent As TNotebook) Do + Begin + StrDispose(StrTemp); + Try + Assert(False, Format('Trace:Page caption --> %S', [Page[PageIndex].Caption])); + StrTemp := StrAlloc(Length(Page[PageIndex].Caption) + 1); + StrPCopy(StrTemp, Page[PageIndex].Caption); + Except + On E: Exception Do + Begin + Assert(False, Format('Trace:TWin32Object.CreateComponent - could not create in csPage --> %S', [E.Message])); + //Exit; + End; + End; + With TCI Do + Begin + Mask := TCIF_TEXT; + PSzText := StrTemp; + End; + Try + Assert(False, Format('Trace:Number of pages: %D, current page: %D', [Pages.Count, PageIndex])); + Window := TabCtrl_InsertItem(Handle, PageIndex, TCI); + Except + Assert(False, 'Trace:csPage - Could not insert page'); + Exit; + End; + If PageIndex >= Pages.Count - 1 Then + TabCtrl_DeleteItem(Handle, Pages.Count); + PageIndex := PageIndex + 1; + SetProp(Handle, 'Lazarus', @Sender); + Self.SetName(Handle, StrTemp); End; - SetProp(Window, 'Lazarus', @Sender); - SetName(Window, strTemp); End; csPopupMenu: Begin Window := CreatePopupMenu; FSubMenu := Window; SetProp(Window, 'Lazarus', @Sender); - SetName(Window, strTemp); + SetName(Window, StrTemp); End; csProgressBar: Begin @@ -1898,7 +1920,7 @@ Begin Assert(False, 'TRACE:CreateComponent - Creating a Track Bar (if we''re lucky)'); Window := CreateWindow(TRACKBAR_CLASS, StrTemp, Flags, Left, Top, Width, Height, Parent, HMENU(Nil), HInstance, Nil); SetProp(Window, 'Lazarus', @Sender); - SetName(Window, strTemp); + SetName(Window, StrTemp); End; End; {Case} @@ -1919,29 +1941,34 @@ Begin If (Sender Is TControl) Then Begin Assert(False, 'Trace:CreateComponent - Assigning window to TControl'); - (Sender as TWinControl).Handle := Window; + (Sender As TWinControl).Handle := Window; End Else If (Sender Is TControlCanvas) Then Begin Assert(False, 'Trace:CreateComponent - Assigning window to TControlCanvas'); - (Sender as TControlCanvas).Handle := Window; + (Sender As TControlCanvas).Handle := Window; End Else If (Sender Is TFont) Then Begin Assert(False, 'Trace:CreateComponent - Assigning P to TFont'); - (Sender as TFont).Handle := Window; + (Sender As TFont).Handle := Window; End; End; SetLCLObject(Window, Sender); + If Window = HWnd(Nil) Then Begin SetProp(Window, 'Style', Pointer(GetWindowLong(Window, GWL_Style))); SetProp(Window, 'ExStyle', Pointer(GetWindowLong(Window, GWL_ExStyle))); End; - StrDispose(StrTemp); + Try + StrDispose(StrTemp); + Except + Assert(False, 'Trace:Warning: Tried to dispose a string that was not allocated'); + End; Assert(False, 'Trace:Leaving CreateComponent'); End; @@ -2023,9 +2050,9 @@ Var TCI: TC_ITEM; Begin Assert(False, 'Trace:TWin32Object.AddNBPage - Start'); - Assert(False, Format('Trace:Adding notebook page %N', [Index])); + Assert(False, Format('Trace:Adding notebook page %D', [Index])); - PStr := StrAlloc(Length(TPage(Child).Caption) + 1); + {PStr := StrAlloc(Length(TPage(Child).Caption) + 1); Try StrPCopy(PStr, TPage(Child).Caption); With TCI Do @@ -2042,7 +2069,7 @@ Begin End; PTabInfo(@Child)^.Caption := PChar(TPage(Child).Caption); - PTabInfo(@Child)^.Index := Index; + PTabInfo(@Child)^.Index := Index;} Assert(False, 'Trace:TWin32Object.AddNBPage - Exit'); End; @@ -2689,26 +2716,7 @@ End; Assigns a name to a window ------------------------------------------------------------------------------} Procedure TWin32Object.SetName(Window: HWND; Value: PChar); -Var - I: Integer; - WndListed: Boolean; Begin - WndListed := False; - - For I := 0 To WndList.Count - 1 Do - Begin - If HWND(WndList[I]) = Window Then - Begin - WndListed := True; - End; - End; - - If Not WndListed Then - Begin - WndList.Capacity := WndList.Count; - WndList.Add(Pointer(Window)); - End; - SetProp(Window, 'Name', Value); End; @@ -2721,27 +2729,8 @@ End; Assigns an owner object to a window ------------------------------------------------------------------------------} Procedure TWin32Object.SetOwner(Window: HWND; Owner: TObject); -Var - I: Integer; - WndListed: Boolean; Begin - WndListed := False; - - For I := 0 To WndList.Count - 1 Do - Begin - If HWND(WndList[I]^) = Window Then - Begin - WndListed := True; - End; - End; - - If Not WndListed Then - Begin - WndList.Capacity := WndList.Count; - WndList.Add(@Window); - End; - - SetProp(Window, 'Lazarus', Pointer(Owner)); + SetProp(Window, 'Lazarus', Owner); SetProp(Window, 'MsgList', Nil); End; @@ -2896,9 +2885,10 @@ Begin End; { + $Log$ + Revision 1.6 2002/01/17 03:17:44 lazarus + Keith: Fixed TPage creation - Revision 1.5 2002/01/12 22:49:02 lazarus - Keith: Fixed compilation problem and some bugs Revision 1.4 2002/01/05 13:16:09 lazarus MG: win32 interface update from Keith Bowes diff --git a/lcl/interfaces/win32/win32proc.inc b/lcl/interfaces/win32/win32proc.inc index c1868fcdb6..a379ea43b8 100644 --- a/lcl/interfaces/win32/win32proc.inc +++ b/lcl/interfaces/win32/win32proc.inc @@ -209,8 +209,8 @@ Begin $003D: Result := 'WM_GETOBJECT'; $0041: Result := 'WM_COMPACTING'; $0044: Result := 'WM_COMMNOTIfY { obsolete in Win32}'; - $0046: Result := 'WM_WINDoWPOSCHANGING'; - $0047: Result := 'WM_WINDoWPOSCHANGED'; + $0046: Result := 'WM_WINDOWPOSCHANGING'; + $0047: Result := 'WM_WINDOWPOSCHANGED'; $0048: Result := 'WM_POWER'; $004A: Result := 'WM_COPYDATA'; $004B: Result := 'WM_CANCELJOURNAL'; @@ -235,26 +235,26 @@ Begin $0086: Result := 'WM_NCACTIVATE'; $0087: Result := 'WM_GETDLGCODE'; $00A0: Result := 'WM_NCMOUSEMOVE'; - $00A1: Result := 'WM_NCLBUTTONDoWN'; + $00A1: Result := 'WM_NCLBUTTONDOWN'; $00A2: Result := 'WM_NCLBUTTONUP'; $00A3: Result := 'WM_NCLBUTTONDBLCLK'; - $00A4: Result := 'WM_NCRBUTTONDoWN'; + $00A4: Result := 'WM_NCRBUTTONDOWN'; $00A5: Result := 'WM_NCRBUTTONUP'; $00A6: Result := 'WM_NCRBUTTONDBLCLK'; - $00A7: Result := 'WM_NCMBUTTONDoWN'; + $00A7: Result := 'WM_NCMBUTTONDOWN'; $00A8: Result := 'WM_NCMBUTTONUP'; $00A9: Result := 'WM_NCMBUTTONDBLCLK'; - $0100: Result := 'WM_KEYFIRST or WM_KEYDoWN'; + $0100: Result := 'WM_KEYFIRST or WM_KEYDOWN'; $0101: Result := 'WM_KEYUP'; $0102: Result := 'WM_CHAR'; $0103: Result := 'WM_DEADCHAR'; - $0104: Result := 'WM_SYSKEYDoWN'; + $0104: Result := 'WM_SYSKEYDOWN'; $0105: Result := 'WM_SYSKEYUP'; $0106: Result := 'WM_SYSCHAR'; $0107: Result := 'WM_SYSDEADCHAR'; $0108: Result := 'WM_KEYLAST'; $010D: Result := 'WM_IME_STARTCOMPOSITION'; - $010E: Result := 'WM_IME_EndCOMPOSITION'; + $010E: Result := 'WM_IME_ENDCOMPOSITION'; $010F: Result := 'WM_IME_COMPOSITION or WM_IME_KEYLAST'; $0110: Result := 'WM_INITDIALOG'; $0111: Result := 'WM_COMMAND'; @@ -280,17 +280,17 @@ Begin $0137: Result := 'WM_CTLCOLORSCROLLBAR'; $0138: Result := 'WM_CTLCOLORSTATIC'; $0200: Result := 'WM_MOUSEFIRST or WM_MOUSEMOVE'; - $0201: Result := 'WM_LBUTTONDoWN'; + $0201: Result := 'WM_LBUTTONDOWN'; $0202: Result := 'WM_LBUTTONUP'; $0203: Result := 'WM_LBUTTONDBLCLK'; - $0204: Result := 'WM_RBUTTONDoWN'; + $0204: Result := 'WM_RBUTTONDOWN'; $0205: Result := 'WM_RBUTTONUP'; $0206: Result := 'WM_RBUTTONDBLCLK'; - $0207: Result := 'WM_MBUTTONDoWN'; + $0207: Result := 'WM_MBUTTONDOWN'; $0208: Result := 'WM_MBUTTONUP'; $0209: Result := 'WM_MBUTTONDBLCLK'; $020A: Result := 'WM_MOUSEWHEEL or WM_MOUSELAST'; - $0210: Result := 'WM_PARENTNOTIfY'; + $0210: Result := 'WM_PARENTNOTIFY'; $0211: Result := 'WM_ENTERMENULOOP'; $0212: Result := 'WM_EXITMENULOOP'; $0213: Result := 'WM_NEXTMENU'; @@ -315,13 +315,13 @@ Begin $0233: Result := 'WM_DROPFILES'; $0234: Result := 'WM_MDIREFRESHMENU'; $0281: Result := 'WM_IME_SETCONTEXT'; - $0282: Result := 'WM_IME_NOTIfY'; + $0282: Result := 'WM_IME_NOTIFY'; $0283: Result := 'WM_IME_CONTROL'; $0284: Result := 'WM_IME_COMPOSITIONFULL'; $0285: Result := 'WM_IME_SELECT'; $0286: Result := 'WM_IME_CHAR'; $0288: Result := 'WM_IME_REQUEST'; - $0290: Result := 'WM_IME_KEYDoWN'; + $0290: Result := 'WM_IME_KEYDOWN'; $0291: Result := 'WM_IME_KEYUP'; $02A1: Result := 'WM_MOUSEHOVER'; $02A3: Result := 'WM_MOUSELEAVE'; @@ -329,9 +329,9 @@ Begin $0301: Result := 'WM_COPY'; $0302: Result := 'WM_PASTE'; $0303: Result := 'WM_CLEAR'; - $0304: Result := 'WM_UNDo'; - $0305: Result := 'WM_REndERFORMAT'; - $0306: Result := 'WM_REndERALLFORMATS'; + $0304: Result := 'WM_UNDO'; + $0305: Result := 'WM_RENDERFORMAT'; + $0306: Result := 'WM_RENDERALLFORMATS'; $0307: Result := 'WM_DESTROYCLIPBOARD'; $0308: Result := 'WM_DRAWCLIPBOARD'; $0309: Result := 'WM_PAINTCLIPBOARD'; @@ -610,7 +610,7 @@ End; Function Win32KeyState2ShiftState(KeyState: Word): TShiftState; Begin Assert(False, 'TRACE:Using Function Win32KeyState2ShiftState which isn''t implemented yet'); - GetShiftState; + Result := GetShiftState; End; @@ -899,6 +899,10 @@ End; { ============================================================================= $Log$ + Revision 1.4 2002/01/17 03:17:44 lazarus + Keith: Fixed TPage creation + + Revision 1.3 2002/01/05 13:16:10 lazarus MG: win32 interface update from Keith Bowes @@ -908,4 +912,4 @@ End; Revision 1.1 2001/08/02 12:58:35 lazarus MG: win32 interface patch from Keith Bowes - } + } \ No newline at end of file diff --git a/lcl/interfaces/win32/win32winapi.inc b/lcl/interfaces/win32/win32winapi.inc index 2b27f7e735..e2eb238ef8 100644 --- a/lcl/interfaces/win32/win32winapi.inc +++ b/lcl/interfaces/win32/win32winapi.inc @@ -48,7 +48,6 @@ Const circle equals 5760 (16*360). Positive values of Angle and AngleLength mean counter-clockwise while negative values mean clockwise direction. Zero degrees is at the 3'o clock position. - ------------------------------------------------------------------------------} Function TWin32Object.Arc(DC: HDC; X, Y, Width, Height, Angle1, Angle2: Integer): Boolean; Begin @@ -138,12 +137,9 @@ End; Returns: the corresponding mime type as string ------------------------------------------------------------------------------} Function TWin32Object.ClipboardFormatToMimeType(FormatID: TClipboardFormat): String; -Var - GFN: PChar; Begin Assert(False, 'Trace:TWin32Object.ClipboardFormatToMimeType - Start'); - Windows.GetClipboardFormatName(FormatID, GFN, MAX_PATH); - Result := StrPas(GFN); + Windows.GetClipboardFormatName(FormatID, @Result, MAX_PATH); Assert(False, 'Trace:TWin32Object.ClipboardFormatToMimeType - Exit'); End; @@ -216,13 +212,18 @@ Var I: Integer; P: PChar; Begin + Result := True; If GetClipboardOwner <> HWND(Nil) Then OnRequestProc(0, Nil); GetMem(Formats, FormatCount * SizeOf(TClipboardFormat)); - For I := 0 To FormatCount Do - Begin - GetClipboardFormatName(Formats[I], @P, MAX_PATH); - RegisterClipboardFormat(@P); + Try + For I := 0 To FormatCount Do + Begin + GetClipboardFormatName(Formats[I], @P, MAX_PATH); + RegisterClipboardFormat(@P); + End; + Except + Result := False; End; FreeMem(Formats); End; @@ -1422,10 +1423,32 @@ End; Adds a new entry or changes an existing entry in the property list of the specified window. + + NOTE: LCLLinux has no RemoveProp function but Windows API requires all set + properties to be removed, so I'm keeping a list of windows with properties + for a properties-enumeration function that's called when the program is quit. ------------------------------------------------------------------------------} Function TWin32Object.SetProp(Handle: HWND; Str: PChar; Data: Pointer): Boolean; +Var + C: Cardinal; + WndListed: Boolean; Begin + Assert(False, 'Trace:TWin32Object.SetProp - Start'); + WndListed := False; + + If WndList.Count > 0 Then + For C := 0 To WndList.Count - 1 Do + If HWND(WndList[C]) = Handle Then + WndListed := True; + + If Not WndListed Then + Begin + WndList.Capacity := WndList.Count; + WndList.Add(Pointer(Handle)); + End; + Result := Windows.SetProp(Handle, Str, Integer(Data)); + Assert(False, Format('Trace:TWin32Object.SetProp --> Window handle: 0x%X, Propery to set: %S, Data to set: 0x%P, Window was previously in list: %S, Property was successfully set: %S', [Handle, String(Str), Data, BOOL_RESULT[WndListed], BOOL_RESULT[Result]])); End; {------------------------------------------------------------------------------ @@ -1686,8 +1709,8 @@ End; { ============================================================================= $Log$ - Revision 1.1 2002/01/06 23:09:53 lazarus - MG: added missing files + Revision 1.2 2002/01/17 03:17:44 lazarus + Keith: Fixed TPage creation } diff --git a/lcl/interfaces/win32/win32winapih.inc b/lcl/interfaces/win32/win32winapih.inc index 1ba1d2e07f..c9fbc1487e 100644 --- a/lcl/interfaces/win32/win32winapih.inc +++ b/lcl/interfaces/win32/win32winapih.inc @@ -34,11 +34,11 @@ Function CreateFontIndirect(Const LogFont: TLogFont): HFONT; Override; Function CreatePenIndirect(Const LogPen: TLogPen): HPEN; Override; { Creates a bitmap from raw pixmap data } Function CreatePixmapIndirect(Const Data: Pointer; Const TransColor: LongInt): HBITMAP; Override; -Function CreateRectRgn(X1, Y1, X2, Y2: Integer): HRGN; +Function CreateRectRgn(X1, Y1, X2, Y2: Integer): HRGN; Override; Function DeleteDC(HDC: HDC): Boolean; Override; Function DeleteObject(GDIObject: HGDIOBJ): Boolean; Override; -Function DestroyCaret(Handle: HWND): Boolean; +Function DestroyCaret(Handle: HWND): Boolean; Override; Function DrawFrameControl(DC: HDC; Var Rect: TRect; UType, UState: Cardinal): Boolean; Override; Function DrawEdge(DC: HDC; Var Rect: TRect; Edge: Cardinal; GrfFlags: Cardinal): Boolean; Override; @@ -84,10 +84,10 @@ Function MaskBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YS Function MessageBox(HWnd: HWND; LPText, LPCaption: PChar; UType: Cardinal): Integer; Override; Function MoveToEx(DC: HDC; X, Y: Integer; OldPoint: PPoint): Boolean; Override; -Function PeekMessage(Var LPMsg: TMsg; Handle: HWND; WMsgFilterMin, WMsgFilterMax, WRemoveMsg: UINT): Boolean; Override; +Function PeekMessage(Var LPMsg: TMsg; Handle: HWND; WMsgFilterMin, WMsgFilterMax, WRemoveMsg: UINT): Boolean; Function Pie(DC: HDC; X, Y, Width, Height, Angle1, Angle2: Integer): Boolean; Override; -Function Polygon(DC: HDC; Points: PPoint; NumPts: Integer; Winding: Boolean): Boolean; -Function Polyline(DC: HDC; Points: PPoint; NumPts: Integer): Boolean; +Function Polygon(DC: HDC; Points: PPoint; NumPts: Integer; Winding: Boolean): Boolean; Override; +Function Polyline(DC: HDC; Points: PPoint; NumPts: Integer): Boolean; Override; Function PostMessage(HWnd: HWND; Msg: Cardinal; WParam: LongInt; LParam: LongInt): Boolean; Override; Function RealizePalette(DC: HDC): Cardinal; Override; @@ -115,7 +115,7 @@ Function SetSysColors(CElements: Integer; Const LPAElements; Const LPARgbValues) Function SetTextCharacterExtra(_HDC: HDC; NCharExtra: Integer): Integer; Override; Function SetTextColor(DC: HDC; Color: TColorRef): TColorRef; Override; Function SetTimer(HWnd: HWND; NIDEvent, uElapse: Integer; LPTimerFunc: TFNTimerProc): Integer; Override; -Function SetWindowLong(Handle: HWND; Idx: Integer; NewLong: LongInt): LongInt; +Function SetWindowLong(Handle: HWND; Idx: Integer; NewLong: LongInt): LongInt; Override; Function SetWindowOrgEx(DC: HDC; NewX, NewY: Integer; Var Point: TPoint): Boolean; Override; Function SetWindowPos(HWnd: HWND; HWndInsertAfter: HWND; X, Y, CX, CY: Integer; UFlags: UINT): Boolean; Override; Function ShowCaret(HWnd: HWND): Boolean; Override; @@ -131,6 +131,9 @@ Function WindowFromPoint(Point: TPoint): HWND; Override; { ============================================================================= $Log$ + Revision 1.2 2002/01/17 03:17:44 lazarus + Keith: Fixed TPage creation + Revision 1.1 2002/01/06 23:09:53 lazarus MG: added missing files diff --git a/lcl/interfaces/win32/winext.pas b/lcl/interfaces/win32/winext.pas index 619ffc4117..af87c57555 100644 --- a/lcl/interfaces/win32/winext.pas +++ b/lcl/interfaces/win32/winext.pas @@ -1,6 +1,6 @@ { Extra Win32 code that's not in the RTL. - Copyright (C) 2001 Keith Bowes. + Copyright (C) 2001, 2002 Keith Bowes. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -15,6 +15,10 @@ Unit WinExt; +{$IFDEF TRACE} + {$ASSERTIONS ON} +{$ENDIF} + {$PACKRECORDS C} {$SMARTLINK ON} @@ -173,7 +177,8 @@ Try StrDispose(TmpStr); TmpStr := Nil; Except - Exception.Create('Tried to deallocate a nil string'); + On E: Exception Do + Assert(False, Format('Trace:Could not deallocate string --> %S', [E.Message])); End; End. \ No newline at end of file