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

Вниз

завтра утром прогу сдавать а проблема возникла там где ее ни кто   Найти похожие ветки 

 
Вудзрш5.01   (2004-04-26 21:01) [0]

Вот проблема, завтра утром прогу сдавать а проблема возникла там где ее ни кто не ожидал. Создал компонент, ну типа кнопки, когда маусом переводишь кнопка становится выпуклой! Все работает ок, до того как я не прицепил еще одно свойство уже из программы на MouseMove, теперь на перемещение кнопка не реагирует, не происходит ее прорисовка в выпуклом виде.


 
Delphi5.01 ©   (2004-04-26 21:23) [1]

Тестирования показало что моя процедура MouseMove полностью перекрывает процедуру MouseMove компонента, так что она вообще не выполняется?!


 
z007   (2004-04-26 21:39) [2]

Видимо, не выполняется. Это надо особо обработать в WndProc компонента или хотя бы в OnMessage .

Как я понимаю, в компоненте кнопка становится выпуклой при обработке сообщения в WndProc ?
Если так, попробуй посмотреть в код KOL и продублировать в WndProc компонента вызов типа if assigned(fOnMouseMove) then...

Результат иногда может быть разным в зависимости от того, вызывается ли fOnMouseMove в WndProc до или после выполнения своего кода.


 
SPeller ©   (2004-04-27 02:54) [3]

А что за компонент?


 
Delphi5.01 ©   (2004-04-27 17:32) [4]

Da komponent eto CrazyButton, ochen pomogaet kogda neskolko knopok ochen blizko drug s drugom raspolojeni i ih konturi ochen izvilistie!

2 z007
ia snachala perekrival pramo svoistvo OnMouseMove, potom v WndProc perenos. WndProc pomoglo no teper soobshenie mouseleave proishodit tolko v tom sluchae esli ia krome WndProc ispolzuiu perekritie OnMouseLeave! A pochemu?
...
 case Msg.message of
   WM_LBUTTONDOWN:
     begin
       pCrazyButton(Sender).fMouseDown(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
     end;
   WM_LBUTTONUP:
     begin
       pCrazyButton(Sender).fMouseUp(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
     end;
   WM_MOUSEMOVE:
     begin
       pCrazyButton(Sender).fMouseMove(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
     end;
   WM_MOUSELEAVE:
     begin
//        MsgOK("OK");
       pCrazyButton(Sender).fLeave(Sender);
     end;
 end;
 Result:=false;  
end;

esli v kode vklucheno
function NewCrazyButton(AParent: pControl): TKOLCrazyButton;
...
Result.OnMouseLeave:=Result.fMouseLeave;
...

to vso ok, a esli net to problemi, mesaga s MouseLeave voobshe ne dohodit do moego komponenta! A pochemu?


 
Delphi5.01 ©   (2004-04-27 17:54) [5]

Testirovanie pokazalo chto po ne izvestnoi mne prichine posle WM_MOUSELEAVE proishodit WM_MOUSEMOVE mesedg?!


 
z007   (2004-04-27 22:42) [6]

См.: kol.WndProcMouseEnterLeave

Программу-то сдал?


 
Delphi5.01 ©   (2004-04-27 23:13) [7]

Da, na konferencie pervoe mesto zanal. Teper na respublikanskuiu konferenciu pustili! :-)


 
Delphi5.01 ©   (2004-04-27 23:15) [8]

Na shot kol.WndProcMouseEnterLeave
Ia prosmotrel kak KOL delaet MouseLeave, u nego kajetsa vso toje samoe chto u mena. No u mena ne raboataet :-)


 
SPeller ©   (2004-04-28 09:39) [9]

Будешь дальше писать на латинице, тем более помогать всем в ломы будет (совет полезный :-)


 
Gandalf ©   (2004-04-28 13:13) [10]

Реально - Delphi5.01 ©  - втою латиницу принципиально не читаю - у меня скорость чтения латиницы очень низкая.


 
Delphi5.01 ©   (2004-04-28 14:31) [11]

A vot i po ruski!

Вот появилась такая мысля!
Что является аналогом inhereted в KOL?
Вот например если а хочу перекрыть свойство MouseClick у моего компонента.
Один из вариантов который мне пришел в голову это старомодный (не работает)

function NewCrazyButton(AParent: pControl): TKOLCrazyButton;
...
begin
...
Result.OnMouseClick:=fMouseClick;
...
end;

procedure TKOLCrazyButton.fMouseClick(...)
...
begin
...
// здесь все что надо чтоб произошло на MouseClick
...
end;

но когда в программе надо прикрепить к моему новому компоненту обработку MouseClick я пишу:
MyButton.OnMouseClick:=MyMouseClick;
Фактически я сам удаляю указатель на процедуру компонента fMouseClick в которой хранится информация что именно должен сделать компонент при MouseClick. Как я заметил в данном случае решением является inhereted но его у KOL нету, или я не смог найти.

Вторым решением является (работает, но не для всех месаг)

function CrazyButtonWndProc(Sender: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
...
begin
...
Result:=false;
case Msg.message of
  WM_LBUTTONDBLCLK:
    begin
      pCrazyButton(Sender).fMouseClick(Sender,
        SmallPointToPoint(TSmallPoint(Msg.LParam)));
    end;
end;
...
end;

procedure TKOLCrazyButton.fMouseClick(...)
...
begin
...
// здесь все что надо чтоб произошло на MouseClick
...
end;

все работает без сбоев, переменная OnMouseMove свободна, при программировании в нее можно помещать указатель на нашу функцию, нижу указанный код не даст сбоев
MyButton.OnMouseClick:=MyMouseClick;

Зачем мне нужно было так длинно все изъяснять, "это же и так всем ясно".

Так вот перейду к сути. Проблема в том что данным методом не возможно обработать сообщение:
WM_MOUSELEAVE:
  begin
    MsgOK("OK");
  end;
А почему? Оно появляется только в том случае если в конструктора есть строка
Result.OnMouseLeave:=fMouseLeave;
Не имеет значения что делает процедура fMouseLeave, она может быть вообще пустой.

В чем загвоздка?

П.С. Не один раз перечитал статью "Создание визуальных компонентов для библиотеки KOL"


 
Delphi5.01 ©   (2004-04-28 14:31) [12]

A vot i po ruski!

Вот появилась такая мысля!
Что является аналогом inhereted в KOL?
Вот например если а хочу перекрыть свойство MouseClick у моего компонента.
Один из вариантов который мне пришел в голову это старомодный (не работает)

function NewCrazyButton(AParent: pControl): TKOLCrazyButton;
...
begin
...
Result.OnMouseClick:=fMouseClick;
...
end;

procedure TKOLCrazyButton.fMouseClick(...)
...
begin
...
// здесь все что надо чтоб произошло на MouseClick
...
end;

но когда в программе надо прикрепить к моему новому компоненту обработку MouseClick я пишу:
MyButton.OnMouseClick:=MyMouseClick;
Фактически я сам удаляю указатель на процедуру компонента fMouseClick в которой хранится информация что именно должен сделать компонент при MouseClick. Как я заметил в данном случае решением является inhereted но его у KOL нету, или я не смог найти.

Вторым решением является (работает, но не для всех месаг)

function CrazyButtonWndProc(Sender: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
...
begin
...
Result:=false;
case Msg.message of
  WM_LBUTTONDBLCLK:
    begin
      pCrazyButton(Sender).fMouseClick(Sender,
        SmallPointToPoint(TSmallPoint(Msg.LParam)));
    end;
end;
...
end;

procedure TKOLCrazyButton.fMouseClick(...)
...
begin
...
// здесь все что надо чтоб произошло на MouseClick
...
end;

все работает без сбоев, переменная OnMouseMove свободна, при программировании в нее можно помещать указатель на нашу функцию, нижу указанный код не даст сбоев
MyButton.OnMouseClick:=MyMouseClick;

Зачем мне нужно было так длинно все изъяснять, "это же и так всем ясно".

Так вот перейду к сути. Проблема в том что данным методом не возможно обработать сообщение:
WM_MOUSELEAVE:
  begin
    MsgOK("OK");
  end;
А почему? Оно появляется только в том случае если в конструктора есть строка
Result.OnMouseLeave:=fMouseLeave;
Не имеет значения что делает процедура fMouseLeave, она может быть вообще пустой.

В чем загвоздка?

П.С. Не один раз перечитал статью "Создание визуальных компонентов для библиотеки KOL"


 
Delphi5.01 ©   (2004-04-28 14:31) [13]

Я имею в виду конструкцию которая дает аналог inhereted в KOL. Как я уже изъяснился обыкновенный старый метод в кол не работает а вот WM_MOUSELEAVE не могу использовать.
Вот еще одна загвоздка, почему-то после WM_MOUSELEAVE я получая и WM_MOUSEMOVE?


 
Delphi5.01 ©   (2004-04-28 17:32) [14]

Вот решил, пусть будет лишнее присваивание Result.OnMouseLeave:=Result.fMouseLeave; Просто присвою какую-то не нужную функцию, и все будет работать (конечно не стабильно но все-таки временно подойдет), но возникла проблема:
По не известной причине после сообщения WM_MOUSELEAVE мгновенно возникает второе сообщение  WM_MOUSEMOVE что реально не должно происходит!


 
z007   (2004-04-28 20:06) [15]

Насчет Inherited, кажется открывалась отдельная ветка.
Мы натурально по разные стороны баррикад и языки у нас непохожие. Шли свою суперкнопку. Сделаем ей все чего надо.


 
Delphi5.01 ©   (2004-04-28 20:17) [16]

Я наверно не правильно выразился когда сказал "Что является аналогом inhereted в KOL?".
Я имел в виду, какая конструкция является аналогом VCL кода:

procedure MouseDown(Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer); override;

procedure TMyComp.MouseDown(Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
...
begin
...
 // делаю что-то
...
 inhereted;
end;

Спасибо за помощь


 
Delphi5.01 ©   (2004-04-28 20:23) [17]

Код не маленький :-)

uses
 Windows, KOL, Messages;

const
 DelimChar=#13;
 MaskColor=clLime;

type
 TPointArray = array of TPoint;
 TRGNArray = array of HRGN;
 TRGNSPoints = record
                 PointsCount: Integer;
                 PointsArray: TPointArray;
               end;

type
 pCrazyButton = ^TCrazyButton;
 TKOLCrazyButton = pCrazyButton;
 TCrazyButton = object(TControl)
 private
   { Private declarations }
   function GetFileName: String;
   procedure SetFileName(Value: String);
   function GetActiveButton: Integer;

   function ReadWord(FileStream: pStream): String;
   Procedure ReadBitMapFile(FileStream: pStream;
                            Index: Byte;
                        var MemoryStream: pStream);
   procedure LoadRGNS(FileStream: PStream);
   procedure MakeRGNSMask;
   procedure DrawBitMapRGN(DestCanvas: PCanvas;
                           SrcBitMap: PBitMap;
                           BkGround: PBitMap;
                           RGN: HRGN);
   procedure LoadData;
   procedure fPaint(Sender: PControl; DC: HDC);
   procedure fMouseMove(Sender: PControl; pt: TPoint);
   procedure fMouseDown(Sender: PControl; pt: TPoint);
   procedure fMouseUp(Sender: PControl; pt: TPoint);
   procedure fMouseLeave(Sender: PObj);
 public
   { Public declarations }
   property FileName: String read GetFileName write SetFileName;
   property ActiveButton: Integer read GetActiveButton;
 end;

type
 pCrazyButtonData = ^TCrazyButtonData;
 TCrazyButtonData = object(TObj)
 private
   { Private declarations }
   fActiveButton: Integer;
   fFileName: String;
   fMMove: Boolean;
   fMDown: Boolean;
   RGNSCount: Integer;
   RGNSPoints: array of TRGNSPoints;
   RGNS: TRGNArray; //kundulebis regionebi
   MaskRGNS: TRGNArray; //Maskis regionebi
   NormalBitMap: pBitMap;
   OverBitMap: pBitMap;
   DownBitMap: pBitMap;
   BufferBitMap1: pBitMap;
   BufferBitMap2: pBitMap;
   BRUSH_: HBRUSH;
 public
   { Public declarations }
   destructor Destroy; virtual;
 end;

function NewCrazyButton(AParent: pControl): TKOLCrazyButton;

implementation

function CrazyButtonWndProc(Sender: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
begin
 case Msg.message of
   WM_LBUTTONDOWN:
     begin
       pCrazyButton(Sender).fMouseDown(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
     end;
   WM_LBUTTONUP:
     begin
       pCrazyButton(Sender).fMouseUp(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
     end;
   WM_MOUSEMOVE:
     begin
       pCrazyButton(Sender).fMouseMove(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
     end;
   WM_MOUSELEAVE:
     begin
       MsgOK("OK");
       pCrazyButton(Sender).fMouseLeave(Sender);
     end;
 end;
 Result:=false;  
end;  

function NewCrazyButton(AParent: pControl): TKOLCrazyButton;
var
 Data: pCrazyButtonData;
begin
 Result:=pCrazyButton(NewPanel(AParent,esNone));
 Result.OnMouseLeave:=Result.fMouseLeave;
 Result.OnPaint:=Result.fPaint;
 Result.AttachProc(@CrazyButtonWndProc);
 Result.Show;

 New(Data,Create);
 Result.CustomObj:=Data;
 Data.NormalBitMap:=NewBitMap(0,0);
 Data.OverBitMap:=NewBitMap(0,0);
 Data.DownBitMap:=NewBitMap(0,0);
 Data.BRUSH_:=CreateSolidBrush(MaskColor);
 Data.FActiveButton:=-1;
end;

destructor TCrazyButtonData.Destroy;
begin
 NormalBitMap.Free;
 OverBitMap.Free;
 DownBitMap.Free;
end;

function TCrazyButton.GetFileName: String;
begin
 Result:=pCrazyButtonData(CustomObj).fFileName;
end;

procedure TCrazyButton.SetFileName(Value: String);
begin
 pCrazyButtonData(CustomObj).fFileName:=Value;
 if pCrazyButtonData(CustomObj).fFileName<>"" then
   LoadData;
end;

function TCrazyButton.GetActiveButton: Integer;
begin
 result:=pCrazyButtonData(CustomObj).fActiveButton;
end;

function TCrazyButton.ReadWord(FileStream: pStream): String;
   var Text_: String;
       Ch: Char;
 begin
   ...
 end;

Procedure TCrazyButton.ReadBitMapFile(FileStream: pStream;
                                     Index: Byte;
                                 var MemoryStream: pStream);
   var i: Integer;
       FileSize: Integer;
       Buffer: array of Char;
 begin
   ...
 end;

procedure TCrazyButton.LoadRGNS(FileStream: PStream);
   var i,j: Integer;
       FileSize: Integer;
 begin
   ...
 end;

procedure TCrazyButton.MakeRGNSMask;
   var i: Integer;
       RGN: HRGN;
 begin
   ...
 end;

procedure TCrazyButton.DrawBitMapRGN(DestCanvas: PCanvas;
                              SrcBitMap: PBitMap;
                              BkGround: PBitMap;
                              RGN: HRGN);
   var TransparentColor: Integer;
 begin
   ...
 end;

procedure TCrazyButton.LoadData;
 var FileStream: PStream;
     MemoryStream: PStream;

 begin
   ...
 end;

procedure TCrazyButton.fPaint(Sender: PControl; DC: HDC);
 begin
   if pCrazyButtonData(CustomObj).fFileName="" then exit;
   if pCrazyButtonData(CustomObj).fActiveButton=-1 then
     begin
       pCrazyButtonData(CustomObj).NormalBitMap.Draw(Canvas.Handle,0,0);
       exit;
     end;
   if pCrazyButtonData(CustomObj).FMMove then
     if Not pCrazyButtonData(CustomObj).FMDown then
       begin
         DrawBitMapRGN(Canvas,pCrazyButtonData(CustomObj).OverBitMap,pCrazyButtonData(CustomObj).NormalBitMap,pCrazyButtonData(Cu stomObj).MaskRGNS[pCrazyButtonData(CustomObj).FActiveButton]);
         exit;
       end else
       begin
         DrawBitMapRGN(Canvas,pCrazyButtonData(CustomObj).DownBitMap,pCrazyButtonData(CustomObj).NormalBitMap,pCrazyButtonData(Cu stomObj).MaskRGNS[pCrazyButtonData(CustomObj).FActiveButton]);
         exit;
       end;
 end;

procedure TCrazyButton.fMouseMove(Sender: PControl; pt: TPoint);
   var i: Integer;
 begin
   pCrazyButtonData(CustomObj).FActiveButton:=-1;
   pCrazyButtonData(CustomObj).FMMove:=True;
   for i:=0 to pCrazyButtonData(CustomObj).RGNSCount-1 do
     if PtInRegion(pCrazyButtonData(CustomObj).RGNS[i],pt.X,pt.Y) then
       begin
         pCrazyButtonData(CustomObj).FActiveButton:=i;
         Break;
       end;
   fPaint(Sender,Canvas.Handle);
 end;

procedure TCrazyButton.fMouseDown(Sender: PControl; pt: TPoint);
 begin
   pCrazyButtonData(CustomObj).FMDown:=True;
   fPaint(Sender,Canvas.Handle);
 end;

procedure TCrazyButton.fMouseUp(Sender: PControl; pt: TPoint);
 begin
   pCrazyButtonData(CustomObj).FMDown:=False;
   fPaint(Sender,Canvas.Handle);
 end;

procedure TCrazyButton.fMouseLeave(Sender: PObj);
begin
 pCrazyButtonData(CustomObj).FActiveButton:=-1;
 fPaint(PControl(Sender),Canvas.Handle);
end;

end.


 
Delphi5.01 ©   (2004-04-30 07:55) [18]

Всем кто считает что вопрос легкий!
На легкие вопросы мне кажется ответы есть а я что-то не вижу ни одного реального ответа!
Хочу поблагодарить z007 который реально посоветовал, и благодаря его совету вопрос был решен.
Всем спасибо кто реально хотел помочь, а не показать что они умней и что я задаю глупые вопросы!
Всегда найдется легкий вопрос в котором что-то можно научится.
Объявляю тему закрытой


 
Дмитрий Галин   (2004-08-12 09:34) [19]

Удалено модератором



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

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

Наверх





Память: 0.54 MB
Время: 0.039 c
14-1108042415
Vaitek
2005-02-10 16:33
2005.02.27
Школьная физика


14-1107956805
Ihor Osov'yak
2005-02-09 16:46
2005.02.27
Посягательство на святое… То бишь (шепотом) - компилятор


14-1108018717
Calm
2005-02-10 09:58
2005.02.27
Ресурс с рецензиями на литературу, сделаем вместе ?


1-1108022203
Игорь нтк
2005-02-10 10:56
2005.02.27
Как выбрать строку Combobox


1-1108224281
TeNY
2005-02-12 19:04
2005.02.27
как правильно использовать функцию EnumResourceNames





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский