Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

заполнение Tpopup в runtime   Найти похожие ветки 

 
Alexandr ©   (2005-01-21 13:30) [0]

приведети плиз пример кода, который
в Tpopup menu
создаст в рунтайме меню, соответвующие уровням:
имяменю 1
имя подменю 1
  имя подподменю 1
  имя подподменю 2
  имя подподменю 3
...
имя подменю 2
....
имя подменю N
имяменю 2
...
имяменю N

номера и мена я буду давать, а на выходе функции должны быть эти 3 номера - номер меню, подменю и под подменю.
Сам массив с номерами и названиями я выдам.


 
stone ©   (2005-01-21 13:43) [1]

TPopUpMenu + F1


> приведети плиз пример кода, который ...

Сколько $?


 
Alexandr ©   (2005-01-21 13:45) [2]

мда...
хорошо, а сколько надо?


 
stone ©   (2005-01-21 13:49) [3]

В справке пример вообще-то есть.
Впрочем, если есть заинтересованность платить плиз в асю (см. анкету)


 
Рамиль ©   (2005-01-21 14:00) [4]

procedure TForm1.Button1Click(Sender: TObject);
var
 mi: TMenuItem;
begin
 mi := TMenuItem.Create(Self);
 mi.Caption := "Caption";
 PopupMenu1.Items.Add(mi);
end;


 
Рамиль ©   (2005-01-21 14:01) [5]

procedure TForm1.Button1Click(Sender: TObject);
var
 mi: TMenuItem;
begin
 mi := TMenuItem.Create(Self);
 mi.Caption := "Caption";
 PopupMenu1.Items.Add(mi);
end;


 
Alexandr ©   (2005-01-24 06:22) [6]

а вот как с подменю?
А как хранить привязку, чтоб выбирать код


 
Alexandr ©   (2005-01-24 13:06) [7]

up


 
MetalFan ©   (2005-01-24 13:21) [8]


>  как хранить привязку, чтоб выбирать код

расшифруй !


 
Alexandr ©   (2005-01-24 14:18) [9]

ну вот в базе есть таблица1
ID
NAME
по ней строится верхний уровень меню.
Далее точно такие же таблица2 и таблица3
необходимо после того как юзер тыкнет мышкой в нужное место, получить эти коды таблица1.id таблица2.id таблица3.id
в зависимости, на каком уровне и что тыкнул.


 
Alexandr ©   (2005-01-24 16:11) [10]

up


 
MetalFan ©   (2005-01-24 16:17) [11]

мда... а без меню обойтись никак?


 
Alexandr ©   (2005-01-24 16:23) [12]

в смысле?
Вот хочу такую навигацию по таблицам master-detail сделать.
Примерно как TreeView но не список и плюсики, а вот как на кнопке "пуск".


 
Alexandr ©   (2005-01-25 10:23) [13]

up


 
stone ©   (2005-01-25 11:32) [14]

Маленькая подсказка:
Items может иметь вложенные уровни, напимер:
PopupMenu1.Items[Index].Items.Add(mi);
т.е.

> Примерно как TreeView но не список и плюсики, а вот как
> на кнопке "пуск".


 
Alexandr ©   (2005-01-25 11:57) [15]

ага. Да я уже сам все сделал.
Сделал наследника с нужными свойствами и все.


 
den303 ©   (2005-01-25 13:47) [16]

Заодно вопрос по теме:

procedure MenuClick;
begin
 //Как я в этой процедуре могу узнать, по какому из пунктов меню кликнул пользователь, если я создаю много пунктов с одной и той же процедурой MenuClick, а никакие параметры передать нельзя, т.к. ругается на TNotifyEvent?
end;

procedure TForm1.Button1Click(Sender: TObject);
var
mi: TMenuItem;
begin
mi := TMenuItem.Create(Self);
mi.Caption := "Caption";
mi.OnClick:=MenuClick;
PopupMenu1.Items.Add(mi);
end;


 
MetalFan ©   (2005-01-25 13:56) [17]


> procedure MenuClick;
> begin
>  //Как я в этой процедуре могу узнать, по какому из пунктов
> меню кликнул пользователь, если я создаю много пунктов с
> одной и той же процедурой MenuClick, а никакие параметры
> передать нельзя, т.к. ругается на TNotifyEvent?
> end;

а Sender уже отменили я смотрю...


 
den303 ©   (2005-01-25 14:06) [18]


> MetalFan ©   (25.01.05 13:56) [17]

С любым параметром, в т.ч. и Sender, Дельфя ругается на "Incopatible types: TNotifyEvent and "procedure,untyped pointer or untuped parameter""


 
Alexandr ©   (2005-01-25 14:42) [19]

type
TDBMenuItem=class(TMenuItem)
public
 categorycode:variant;
 subcategory_id:variant;
 gruppa_id:variant;
end ;


 
den303 ©   (2005-01-25 15:46) [20]

Мастера! Ответьте, плиз на

> den303 ©   (25.01.05 13:47) [16]
и
> den303 ©   (25.01.05 14:06) [18]


 
Erik1 ©   (2005-01-25 16:39) [21]

В нутри процедуры это узнать невозможно, поскольку реакция на нажатие поступает как Message. В этом случае следует использовать форму и заполнить ее элементами списка. Я использую для этого:
TGetItem = procedure(var Index: integer; var Buf: string) of object;

 RStandart = record
   Id: integer;
   Name: ShortString;
 end;
 TDefArray = array of RStandart;
 PDefArray = ^TDefArray;

 TPopup = class(TCustomForm)
   lbChoice: TListBox;
   procedure lbChoiceClick(Sender: TObject);
   //    procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure lbChoiceMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure lbChoiceKeyDown(Sender: TObject; var Key: Word; Shift:
     TShiftState);
 private
   GetProc: TGetItem;
   ArrData: PDefArray;

   procedure SetPosit(const Pt: TPoint);
   procedure PopulateChoice(List: TStrings);
   procedure GetDefaultItem(var Index: integer; var Buf: string);
 public
   ResultIndex: integer;
   constructor Create(const Pt: TPoint; const pArrData: PDefArray;
     const Proc: TGetItem); virtual;
 end;

implementation
uses Controls, Math;
{ TPopup }

constructor TPopup.Create(const Pt: TPoint; const pArrData: PDefArray;
 const Proc: TGetItem);
begin
 inherited CreateNew(nil);
 GetProc := Proc;
 ArrData := pArrData;

 BorderIcons := [];
 BorderStyle := bsNone;
 Width := 123;
 Scaled := false;
 //  OnClose :=  FormClose;

 lbChoice := TListBox.Create(Self);
 lbChoice.Parent := Self;
 lbChoice.Align := alClient;
 lbChoice.ExtendedSelect := false;
 lbChoice.OnClick := lbChoiceClick;
 lbChoice.OnMouseMove := lbChoiceMouseMove;
 lbChoice.OnKeyDown := lbChoiceKeyDown;

 PopulateChoice(lbChoice.Items);
 SetPosit(Pt);
 lbChoice.ItemIndex := 0;
end;

procedure TPopup.SetPosit(const Pt: TPoint);
begin
 Height := lbChoice.ItemHeight * lbChoice.Items.Count + 4;
 if (Pt.x > -1) and (Pt.y > -1) then
 begin
   Position := poDesigned;
   Left := Pt.x;
   Top := Pt.y;
   if Left + Width > Application.MainForm.Width then
     Left := Application.MainForm.Width - Width;
   if Top + Height > Application.MainForm.Height then
     Top := Application.MainForm.Height - Height;
 end;
end;

procedure TPopup.PopulateChoice(List: TStrings);
var
 i: Integer;
 Buf: string;
begin
 i := 0;
 while i <> -1 do
 begin
   if not Assigned(GetProc) then
     GetDefaultItem(i, Buf)
   else
     GetProc(i, Buf);
   if i <> -1 then
     List.Append(Buf);
   Width := Max(Width, Length(Buf) * 6);
 end;
end;
{ Erik
procedure TPopup.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
}

procedure TPopup.lbChoiceClick(Sender: TObject);
begin
 if lbChoice.ItemIndex >= 0 then
 begin
   ResultIndex := lbChoice.ItemIndex;
   Close;
 end;
end;

procedure TPopup.lbChoiceMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 lbChoice.ItemIndex := lbChoice.ItemAtPos(Point(X, Y), True);
end;

procedure TPopup.lbChoiceKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 case Key of
   VK_DOWN:
     begin
       Key := 0;
       lbChoice.ItemIndex := Min(lbChoice.Items.Count - 1, lbChoice.ItemIndex +
         1);
     end;
   VK_UP:
     begin
       Key := 0;
       lbChoice.ItemIndex := Max(0, lbChoice.ItemIndex - 1);
     end;
   VK_LEFT, VK_RIGHT: Key := 0;
   VK_RETURN: lbChoiceClick(Sender);
 end;
end;

procedure TPopup.GetDefaultItem(var Index: integer; var Buf: string);
begin
 if Index > Length(ArrData^) - 1 then
 begin
   Index := -1;
   Exit;
 end;
 Buf := ArrData^[Index].Name;
 Inc(Index);
end;

end.


 
Den303 ©   (2005-01-25 16:57) [22]


> Erik1 ©   (25.01.05 16:39) [21]

Большое спасибо за код! Очень помог. Спасибо!


 
Alexandr ©   (2005-01-27 09:34) [23]


> Erik1 ©   (25.01.05 16:39) [21]


а дальше?


 
Erik1 ©   (2005-01-27 11:42) [24]

А что далше, пример как  вызывать привести? Есть 2 метода передачи списка, через процедуру или через масив. Привожу через масив:
function TLepingForm.CreatePopUp(DataSet: TDataSet; Pt: TPoint): Integer;
Var
 Index: Integer;
 ArrTemp: TDefArray;
begin
 Result := -1;
 with DataSet do
   if RecordCount > 1 then
   begin
     Index := 0;
     SetLength(ArrTemp, RecordCount + 1);
     while not EOF do
     begin
      with ArrTemp[Index] do
       begin
       Name := FieldByName("NIMETUS").AsString;
         Id := FieldByName("ID").AsInteger;
       end;
       Next;
     end;

     with TPopup.Create(Pt, @ArrTemp, nil) do
     begin
       ShowModal;
       Result := ArrTemp[ResultIndex].Id;
       Free;
     end;
   end
   else if RecordCount = 1 then
     Result := FieldByName("ID").AsInteger;
end;
Вот исзодный вызов:
with Sender do
 Pt := ClientToScreen(Point(Width - 5, Height div 2));
 ID := CreatePopUp(DataSet, Pt);
Думаю несоставит труда CreatePopUp переработать для себя.


 
Alexandr ©   (2005-01-27 11:56) [25]

а с подменю?
Ладно, это я уже придираюсь :)


 
DN ©   (2005-01-27 12:31) [26]

=> den303 ©   (25.01.05 13:47) [16]

procedure MenuClick;
begin
//Как я в этой процедуре могу узнать, по какому из пунктов меню кликнул пользователь, если я создаю много пунктов с одной и той же процедурой MenuClick, а никакие параметры передать нельзя, т.к. ругается на TNotifyEvent?
 if (Sender as TMenuItem).Tag=1 then
 ...

end;

procedure TForm1.Button1Click(Sender: TObject);
var
mi: TMenuItem;
begin
mi := TMenuItem.Create(Self);
mi.Caption := "Caption";
mi.OnClick:=MenuClick;
mi.Tag:= 1;
PopupMenu1.Items.Add(mi);
end;



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

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.026 c
11-1090850697
AlexandrK
2004-07-26 18:04
2005.02.13
Проблемы с MDI


14-1106311908
мазербо)
2005-01-21 15:51
2005.02.13
есть у кого Hellsing?


6-1101822516
Tor
2004-11-30 16:48
2005.02.13
Передача сложных типов данных (класс) в Web-сервисе


14-1105804147
Чеширский_Кот
2005-01-15 18:49
2005.02.13
Sourceforge.net


4-1103808045
Alek
2004-12-23 16:20
2005.02.13
Посылка сообщений!