Конференция "KOL" » найти контрол
 
  • Dy1 (04.11.09 19:15) [0]
    на форме панели, на них по несколько контролов, нужно найти панель под курсором.
    Контрол под курсором вероятно form.ControlAtPos(form.Position);
    Вопрос: как узнать панель это или, например, метка на этой панели?
    Теги использовать нежелательно - заняты.
  • Jon © (04.11.09 20:05) [1]
    label.parent ?
  • Dy1 (04.11.09 21:18) [2]
    а как узнать, что кликнули на label, а не на её панели?
  • Jon © (04.11.09 21:59) [3]
    I hope that I understand you correctly:


    program Test;

    uses
     Windows, KOL;

    var
     Panel, Label1, Label2: PControl;

    procedure DoClick(Dummy: Pointer; Sender: PObj);
    begin
     if PControl(Sender).Parent = Panel then
       ShowMsg('Child:'+PControl(Sender).Caption,MB_OK)
     else
       ShowMsg('Panel',MB_OK)
    end;

    begin
     Applet := NewForm(nil,'Test').SetClientSize(120,120);
     Panel := NewPanel(Applet,esRaised).SetAlign(caClient).SetBorder(20);
     Label1 := NewLabel(Panel,'LABEL1');
     Label2 := NewLabel(Panel,'LABEL2').PlaceDown;
     Label1.Color := clRed;
     Label2.Color := clRed;
     Panel.OnClick := TOnEvent(MakeMethod(nil,@DoClick));
     Label1.OnClick := TOnEvent(MakeMethod(nil,@DoClick));
     Label2.OnClick := TOnEvent(MakeMethod(nil,@DoClick));
     Run(Applet);
    end.

  • Dy1 (04.11.09 22:24) [4]
    интересно что делает IsControl :)

    MCK
    procedure TForm1.PopMenuNDelMenu(Sender: PMenu; Item: Integer);
    var
     cp: TPoint;
    begin
     windows.GetCursorPos(cp);
     windows.ScreenToClient(Form1.Form.GetWindowHandle, cp);
     if Form.ControlAtPos(cp.X, cp.Y, ???) ??? then
    end;
  • MTsv DN (05.11.09 13:07) [5]
    USE_NAMES и по имени. Лично я использую префиксы (так сложилось): lbl, pnl, btn, tv, lv и т.д.
  • Vladimir Kladov © (05.11.09 16:59) [6]
    Или Tag.
  • Dy1 (05.11.09 19:27) [7]
    с {$DEFINE USE_NAMES} появляется 20 Identifier redeclared: 'Name' в KOLEdb. Куда смотреть?
  • MTsv DN (05.11.09 21:11) [8]
    Смотри в код...
  • Dy1 (05.11.09 22:37) [9]
    все 20 указывают на строки вида "var I: Integer;", в этом модуле дефайнов нет. Я не понимаю что и где не так
  • MTsv DN (05.11.09 23:27) [10]
    > с {$DEFINE USE_NAMES} появляется 20 Identifier redeclared: 'Name' в KOLEdb. Куда смотреть?
    написано же "редикларейтед 'Name'". Значит в KOLEdb тоже есть 'Name'. Переименуй его в объекте и во всем коде. Это же основы ООП...Наследование?
  • MTsv DN (05.11.09 23:29) [11]
    Там вообще везде одни Nam'ы...вот это и правь...
  • Dy1 (06.11.09 21:36) [12]
    в kol.pas примерно на 36200 строчке есть ф-я:
    function TControl.ControlAtPos( X, Y: Integer; IgnoreDisabled: Boolean ): PControl;
    var I: Integer;
       C: PControl;
       CR, VR: TRect;
    begin
      Result := nil;
      CR := ControlRect;
      if Windowed then
         CR := MakeRect( 0, 0, 0, 0 );
      X := X + CR.Left; // - R.Left;
      Y := Y + CR.Top; // - R.Top;
      for I := ChildCount { + MembersCount } - 1 downto 0 do
      begin
         C := Children[ I ]; //Members[ I ];
         if C.Visible then
         if (not IgnoreDisabled) or IgnoreDisabled and C.Enabled then
         begin
            VR := C.ControlRect;
            if (X >= VR.Left) and (X < VR.Right) and
               (Y >= VR.Top) and (Y < VR.Bottom) then
            begin
               Result := C;
               Exit;
            end;
         end;
      end;
    end;


    что там делает (not IgnoreDisabled) or IgnoreDisabled? Если нужно что-то одно, то что?
  • Dy1 (06.11.09 22:52) [13]
    свойство Name всегда пустое
 
Конференция "KOL" » найти контрол
Есть новые Нет новых   [134431   +12][b:0][p:0.002]