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

Вниз

заполнение 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.041 c
1-1106819789
SlaT
2005-01-27 12:56
2005.02.13
Delphi и обработка нажатий клавиш в др. приложениях


14-1106476885
Шишкин Илья
2005-01-23 13:41
2005.02.13
Печать PDF


6-1102010783
AdmeraL
2004-12-02 21:06
2005.02.13
Internet


14-1106290671
sapsi
2005-01-21 09:57
2005.02.13
О программистах


14-1106458331
guest_Dmitry
2005-01-23 08:32
2005.02.13
Вопрос по AdvStringGrid





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