нужна помощь с диалоговыми окнами


#1

что то у меня в упор не выходит диалога с диалогами. вот набросал программку для теста

{$reference 'System.Windows.Forms.dll'}

uses System, System.Windows.Forms, System.Net;

type
    Form1 = class(Form)
        private
            Menu1 : MainMenu := new MainMenu;
            MenuItemFile : MenuItem := new MenuItem('Файл');
            MenuItemOpen : MenuItem := new MenuItem('Открыть');
            MenuItemExit : MenuItem := new MenuItem('Выход');
            OpenFileDialog1 : OpenFileDialog := new OpenFileDialog;
            procedure MenuItemExit_Click(sender : object; e : System.EventArgs);
            begin
                Close;
            end;
            procedure MenuItemOpen_Click(sender : object; e : System.EventArgs);
            begin
                if OpenFileDialog1.ShowDialog = system.Windows.Forms.DialogResult.OK then begin
                
                end
            end;
        public
            constructor Create;
            begin
                self.Menu := Menu1;
                Menu1.MenuItems.Add(MenuItemFile);
                MenuItemFile.MenuItems.Add(MenuItemOpen);
                MenuItemFile.MenuItems.Add(MenuItemExit);
                MenuItemExit.Click += System.EventHandler(self.MenuItemExit_Click);
                MenuItemOpen.Click += System.EventHandler(self.MenuItemOpen_Click);
            end;
        end;

begin
    var MainForm : Form1 := new Form1;
    Application.run(MainForm);
end.

все вроде круто и как по докам, но при попытке вызвать OpenFileDialog прога зависает и крашится. Диалог выбора цвета работает идеально, а OpenFileDialog и SaveFileDialog ни в какую. Видел в нете что такая проблема не только у меня. Но те советы мне не помогли. Может кто знает как прижучить эти диалоги?


#2

Дайте код который зависает и крашится.


#3

код типа в посте :slight_smile: Окошко запускается, меню работает, но когда выбираю Файл=>Открыть то прога крашится.


#4

А, я не дочитал, подумал это код в котором вы велосипедное диалоговое окно пытались сделать… Сейчас попробую разобраться. Но для начала…

                MenuItemExit.Click += System.EventHandler(self.MenuItemExit_Click);

Паскаль сам приводит типы делегатов, поэтому:

                MenuItemExit.Click += self.MenuItemExit_Click;

А вообще лучше лямбдой:

                MenuItemExit.Click += procedure(o,e)->*Оператор*;
                MenuItemExit.Click += (o,e)->
                begin
                  *много операторов*
                end;

#5

не верю в эти всякие лямбды, старый я уже для этого :slight_smile:

ну я делал по докам с СиШарповыми примерами и описаниями и старался не отходить по возможности от оригинала.


#6

Не знаю где вы искали, но я на msdn, и вот первый ответ со стак оверфлоу, который сразу попадается в глаза:
https://social.msdn.microsoft.com/Search/en-US?query=OpenFileDialog.ShowDialog&pgArea=header&emptyWatermark=true&ac=4

Проблема в том, что нефиг форму в MTA потоке запускать, базовые функции могут работать, но обычно надо делать вот такой отдельный поток:

  var thr := new System.Threading.Thread(()->
  begin
    var MainForm: Form1 := new Form1;
    Application.run(MainForm);
  end);
  thr.ApartmentState := System.Threading.ApartmentState.STA;
  thr.Start;

#7

Ура! Заработало! :slight_smile:

С .Net я імею дело всего пару дней, так что я еще не привык к ее фишкам и особенностям. В Дельфях все было просто и понятно и работало сразу и без заморочек.


#8

Вообще в C# это решается проще, через атрибут на процедуре Main. Но в паскале это не прокатит.


#9

этот вариант я видел и у меня он не прокатил :slight_smile: поэтому и задал вопрос тут