Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/365: Рейтинг темы: голосов - 365, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 1
1

Создание окна для ввода и вывода информации

14.06.2013, 16:44. Показов 76420. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!
Кто-нибудь сталкивался с задачей создания окон в powershell и вывода инфы командлетов в gui-окна?
То есть формируется окно, в него вводится инфо, на основе введенного формируется запрос и ответ выдается тоже в gui окне (идет обращение к AD и возвращает инфу из профиля)
Пока только нашел, как создать окно, но тут застопорился...
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
 
$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Определение сотрудника по телефону"
$objForm.Size = New-Object System.Drawing.Size(300,200) 
$objForm.StartPosition = "CenterScreen"
 
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}})
 
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)
 
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Введите номер телефона сюда:"
$objForm.Controls.Add($objLabel) 
 
$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox.Size = New-Object System.Drawing.Size(260,20) 
$objForm.Controls.Add($objTextBox) 
 
$objForm.Topmost = $True
 
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
 
$x
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2013, 16:44
Ответы с готовыми решениями:

Написать программу для ввода-вывода информации о пяти студентах
Здравствуйте! Помогите написать программу на Visual Studio 2010. Задание: Написать программу в...

Создание формы для вывода информации
Доброе утро! Меня заклинило..подскажите, пожалуйста, как правильно и грамотно реализовать форму...

Создание шаблона для ввода информации
Пишу курсач. Тема информационное приложение 'Танки 2 мировой'. Задумал сделать для начала основу и...

Создание формы для ввода информации в таблицу
Добрый день! Помогите в создании формы для базы данных "Деканат". Необходимо: -"Создать...

19
MoxFulder
15.07.2013, 17:17 2
Скачиваешь: [deleted] (Это primalforms community edition), если нет доверия к моей ссылке, то можно скачать на их сайте: http://www.sapien.com/ в списке программ её нет (интегрировали в платную версию PowerShell Studio), нужно зарегистрироваться, после чего в спец разделе загрузок, можно будет скачать этот файлик с установкой только редактора форм).
Далее визуально создаёшь необходимую форму, экспортируешь в буфер (или сразу в повершел файл).
И в сгенерированном коде добавляешь действия для кнопок (в коде уже будут заготовки):
PowerShell
1
2
3
4
5
button2_OnClick= 
{
#TODO: Place custom script here
 
}
добавляешь заместо строки TODO, нужный фрагмент кода, функцию.

Сразу предупреждаю, что могут возникнуть некоторые сложности с реализацией задумок с использованием Powershell =)
Если будут, вопросы, пиши.
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
13.11.2020, 05:49 3
Самый простой обходной путь - буфер обмена. Даже удивило, что русские буквы не потерялись.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
 
$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Определение сотрудника по телефону"
$objForm.Size = New-Object System.Drawing.Size(300,200) 
$objForm.StartPosition = "CenterScreen"
 
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}})
 
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({[System.Windows.Forms.Clipboard]::SetText($objTextBox.Text);$objForm.Close()})
$objForm.Controls.Add($OKButton)
 
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Введите номер телефона сюда:"
$objForm.Controls.Add($objLabel) 
 
$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox.Size = New-Object System.Drawing.Size(260,20) 
$objForm.Controls.Add($objTextBox) 
 
$objForm.Topmost = $True
 
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
 
$x=[System.Windows.Forms.Clipboard]::GetText();
$x
Добавлено через 10 минут
Вообще, $objForm - это другое окно по сути и для того, чтобы общаться с ним, нужно работать с другим потоком PS.
и код получится не слишком и большой, но слишком "дурной".
Я делал когда то пример общения между формами на C#, и есть готовый пример, но не сейчас ...
Может позже.
0
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
13.11.2020, 23:01 4
есть большоу количестро способов взаимодействия PS и C# - clipboard это довольно оригинально
6 лет назад я про формы написал статью http://www.codeproject.com/Art... -Windows-F
посмотрите там полно приверов и есть гитахб
http://www.codeproject.com/Art... -Windows-F
0
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
14.11.2020, 09:50 5
Возможно вы не поняли. Многопоточность - при взаимодействии между формами одной программы и одного языка.
Когда вы запускаете новую форму, поток основной программы останавливается и естественно не может ни знать ни получить переменные основного потока. Вот поэтому и необходим второй поток.
Если же говорить о взаимодействиях между ..., то в данный момент..., уже полгода наверное хочу разобраться, и всё ещё нахожу более "важные" дела... в возможности вставки уже скомпилированного кода c# непосредственно в скрипты. Конечно - это довольно круто в отношении скорости выполнения, но совершенно теряет достоинство программирования на скриптах - скорости модификации кода программы.
Вот ссылки, которые я сохранил, для начала процесса собственного ликбеза по этому вопросу:
https://www.ired.team/offensiv... ttojscript
https://gist.github.com/vector... 3b151120d9
Может и заинтересует
0
1792 / 343 / 100
Регистрация: 26.09.2020
Сообщений: 676
14.11.2020, 16:48 6
$Script:x не годится?

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[string] $Script:x
 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
 
$objForm = [System.Windows.Forms.Form]::new()
$objForm.Text = "Определение сотрудника по телефону"
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"
 
$OK = { $Script:x = $objTextBox.Text; $objForm.Close() }
 
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({ if ($_.KeyCode -eq "Enter") { $OK.Invoke() } })
$objForm.Add_KeyDown({ if ($_.KeyCode -eq "Escape") { $objForm.Close() } })
 
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click( { $OK.Invoke() })
$objForm.Controls.Add($OKButton)
 
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20)
$objLabel.Size = New-Object System.Drawing.Size(280,20)
$objLabel.Text = "Введите номер телефона сюда:"
$objForm.Controls.Add($objLabel)
 
$objTextBox = New-Object System.Windows.Forms.TextBox
$objTextBox.Location = New-Object System.Drawing.Size(10,40)
$objTextBox.Size = New-Object System.Drawing.Size(260,20)
$objForm.Controls.Add($objTextBox)
 
$objForm.Topmost = $True
 
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
 
$Script:x
1
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
15.11.2020, 05:10 7
@Garric base64 делать нет необходимости из повершелла компилируются во время выполнения какие хотите другие .net языки

для того чтобы передать данные из win32 или wpf в скипт достаточно стандарнтый способ - создать реализацию IWin32Window https://docs.microsoft.com/en-... in32window - и через ее


Handle { get; }
Property Value
IntPtr
A handle to the window represented by the implementer.

передать хендл окна в котором работает скрипт в форму

https://docs.microsoft.com/en-... showdialog
Код
 
$window_handle = [System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle


$f = New-Object System.Windows.Forms.Form
... рисуем форму и т.д.

Add-Type -TypeDefinition @"
using System;
using System.Windows.Forms;
public class Win32Window : IWin32Window
{
    private IntPtr _hWnd;
    private int _data;
    public int Data
    {
        get { return _data; }
        set { _data = value; }
    }

    public Win32Window(IntPtr handle)
    {
        _hWnd = handle;
    }

    public IntPtr Handle
    {
        get { return _hWnd; }
    }
}
"@
$caller = new-object Win32Window -ArgumentList ($window_handle)

[void]$f.ShowDialog([win32window]($caller))
в обработчиках событий писать в $caller.Data в повершелле читать $caller.Data

примеры там в статье
0
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
15.11.2020, 14:17 8
А в чём смысл? Вызвать из PS C# экзешник, создать форму(что либо другое), получить хэндл, передать обратно? ...
если есть возможность вставить уже скомпилированный код? Ну ..., по крайней мере это касается только js и vbs, как видно их представленной мной ссылки. Для PS пожалуй, всё же придётся "копать" ваш вриант.
Конечно, js - пожалуй наиболее любимый мой язык, даже для windows, но почему то пишу постоянно, то батники, то PS. Похоже, потому что всегда есть похожие примеры. А на js обычно - всё с нуля, и с запросами к внешним прогам ... начиная с собственного местоположения.
К сожалению, вчера перекопал все свои архивы, пример с формами в разных потоках "сгорел" при случайном изменении разметки ntfs на GPT, при попытке, для пробы, установить планшетный, заточенный для промышленной установки windows, как дополнительную систему. ... ну он просто автоматически форматнул весь мой диск. Было грусто ... очень. Большую часть информации, мне всё же удалось вернуть, что то из архивов, что то Starus(ом), и ... затем js скрипты, уже при помощи ... WinHex. И то не все, и то только потому, что я помнил названия, не всех, а большинства js файлов на память. (ни одна программа восстановления данных, как оказалось не сканирует всё! Они сканируют лишь определённые типы файлов, js в которые не входит!) Так что надежда на то, что всё обойдётся не всегда оправдана.
Если бы нашёл мой пример. Хотя мне, это уже кажется как глюк моей памяти, конечно бы выложил. Остался лишь пример (крутануть данные из TextBox1 через другой поток, возможно, что то поделать с ними там, пока основной "крутится где то в недрах своей формы" и вставить их в TextBox2). Возможно даже это поможет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace TextBox_в_потоке
{
    //https://**********************/questions/820786/Получение-текста-из-textbox-в-потоке
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            textBox1.Text = "AAAAAAAAAAAAAAA\r\nBBBBBBBBBBBBBB\r\nCCCCCCCCCCCCC\r\nDDDDDDDDDDDDD\r\nEEEEEEEEEEEEE\r\nFFFFFFFFFFFFF\r\nGGGGGGGGGGGGGGGGG\r\nHHHHHHHHHHHHH";
        }
        public delegate void ChangeUI(string s);//функция
        private ChangeUI myUi;//делегат
        private Threads _myThreads;//поток
        public void Changed(string s)
        {
            if (InvokeRequired)
            {
                Invoke(myUi, s);
                return;
            }
            // Здесь любые действия с элементами управления
           textBox2.Text = s;
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
             myUi = new ChangeUI(Changed);//делегат
            _myThreads = new Threads(myUi);//поток
            _myThreads.Run(1);//количество раз
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static TextBox_в_потоке.Form1;
 
namespace TextBox_в_потоке
{
    public class Threads
    {
        private ChangeUI _ui;//функция
        private List<Thread> _threads;//лист потоков
        public Threads(ChangeUI ui){_ui = ui;}//копирование потока
        public void Run(int countThreads)//вызываемая функция
        {
            _threads = new List<Thread>();
            for (int i = 0; i < countThreads; i++)
            {
                var thread = new Thread(Test);//захват копии потока в функцию Test
                thread.IsBackground = true;
                _threads.Add(thread);
                _threads[i].Start();
            }
 
        }
        public void Abort()
        {
            foreach (Thread thread in _threads){ thread.Abort();}
            _threads.Clear();
        }
        private string textBox1_text;
        private void Test()
        {
            // любые действия
            var name = "textBox1";
            if (Form1.ActiveForm.Controls.ContainsKey(name))
            {
                var textBox = Form1.ActiveForm.Controls[name];
                textBox1_text = textBox.Text;
            }
            _ui(textBox1_text);//"здесь текст который нужно передать в форму"
        }
    }
}
Добавлено через 16 минут
Да, ещё. Крутани в моём коде С#, в основном потоке, какой нибудь счётчик, чтобы удостоверится, что поток не "застыл".
Я этого не сделал когда то, понимая, что это должно работать по web опыту, прежде чем пытаться прикрутить.
Просто я не знал тогда, для чего мне это было в тот момент нужно. По крайней мере, в любом случае, операции, которые можно распараллелить, лучше распараллеливать. В инете вообще нет работающих "многопоточных" примеров. Всё из разряда "так должно быть" и всё на этом.

Добавлено через 3 часа 26 минут
Нет. Определённо это работает. Я делал эти 2 окна, передающих данные друг другу и тупо смотрел на них ... думая: "и нак это мне надо? Я понимаю сам второй поток: видео, фото, но эта шняга зачем"
Оказалось, что возможно, довольно востребованная "штука" в PS, где возможно можно сделать свои окна, сместив неудобный с точки зрения компиляции C# с "домашнего" программирования.
0
㊙️
1091 / 239 / 57
Регистрация: 10.08.2018
Сообщений: 568
15.11.2020, 18:29 9
Цитата Сообщение от Garric Посмотреть сообщение
Самый простой обходной путь - буфер обмена.
Вы какую задачу решаете?
Эту:
Цитата Сообщение от S1aanesh Посмотреть сообщение
формируется окно, в него вводится инфо, на основе введенного формируется запрос и ответ выдается тоже в gui окне
или как получить данные из textbox?
Буфер обмена здесь трогать не нужно.
0
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
15.11.2020, 20:44 10
Будь добр. Найди мне фразу а этой ветке: "Буфер обмена здесь трогать не нужно."
0
1792 / 343 / 100
Регистрация: 26.09.2020
Сообщений: 676
16.11.2020, 16:08 11
А тема то старая
У топик стартера в коде форма закрывается. Требуется вывести в консоль полученный в форме x. Для этого $Script:x достаточно.

Для динамического взаимодействия, не закрывая формы используя Runspaces.
В примере данные вводятся в текстовое поля, нажимается кнопка OK или клавиша Enter, введённые данные отображаются в надписи.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$Script:SyncHashTable = [Hashtable]::Synchronized(@{})
 
$RunSpace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$RunSpace.ApartmentState = "STA"
$RunSpace.ThreadOptions = "ReuseThread"
$RunSpace.Open()
$RunSpace.SessionStateProxy.SetVariable("SyncHashTable", $Script:SyncHashTable)
 
$PowerShellCmd = [Management.Automation.PowerShell]::Create().AddScript( {
        [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
        [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
 
        $Script:SyncHashTable.objForm = New-Object System.Windows.Forms.Form
        $Script:SyncHashTable.InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
        $Script:SyncHashTable.objForm.Size = New-Object System.Drawing.Size(340, 200)
        $Script:SyncHashTable.objForm.Name = "objForm"
        $Script:SyncHashTable.objForm.Text = "Test form"
 
        $Script:SyncHashTable.objLabel = New-Object System.Windows.Forms.Label
        $Script:SyncHashTable.objLabel.Location = New-Object System.Drawing.Size(10,20)
        $Script:SyncHashTable.objLabel.Size = New-Object System.Drawing.Size(320,20)
        $Script:SyncHashTable.objLabel.Text = "Введите данные и нажмите кнопку OK или клавишу Enter:"
        $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.objLabel)
 
        $Script:SyncHashTable.objTextBox = New-Object System.Windows.Forms.TextBox
        $Script:SyncHashTable.objTextBox.Location = New-Object System.Drawing.Size(10,40)
        $Script:SyncHashTable.objTextBox.Size = New-Object System.Drawing.Size(300,20)
        $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.objTextBox)
 
        $Script:SyncHashTable.objForm.KeyPreview = $True
        $Script:SyncHashTable.objForm.Add_KeyDown( { if ($_.KeyCode -eq "Enter") { $Script:SyncHashTable.objLabel.Text = $Script:SyncHashTable.objTextBox.Text } })
        $Script:SyncHashTable.objForm.Add_KeyDown( { if ($_.KeyCode -eq "Escape") { $objForm.Close() } })
 
        $Script:SyncHashTable.OKButton = New-Object System.Windows.Forms.Button
        $Script:SyncHashTable.OKButton.Location = New-Object System.Drawing.Size(75,120)
        $Script:SyncHashTable.OKButton.Size = New-Object System.Drawing.Size(75,23)
        $Script:SyncHashTable.OKButton.Text = "OK"
        $Script:SyncHashTable.OKButton.Add_Click( { $Script:SyncHashTable.objLabel.Text = $Script:SyncHashTable.objTextBox.Text } )
        $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.OKButton)
 
        $Script:SyncHashTable.InitialFormWindowState = $Script:SyncHashTable.objForm.WindowState
        $Script:SyncHashTable.objForm.add_Load($Script:SyncHashTable.OnLoadForm_StateCorrection)
        [void] $Script:SyncHashTable.objForm.ShowDialog()
    } )
 
$PowerShellCmd.Runspace = $RunSpace
$PowerShellCmd.BeginInvoke()
1
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
16.11.2020, 20:23 12
Вы так и не поняли. Вы даже не выходили за пределы дочерней формы, чтобы изобразить введённую строку на экране ... опять таки формы, а не основной программы.
$x должен появится здесь, накладываю его на последние две строки вашего кода:
.....
$PowerShellCmd.Runspace = $RunSpace
$PowerShellCmd.BeginInvoke()
$x ---- вот он - желаемый результат, полученный из формы

После всего кода, в основном потоке, а не в дочернем, не в дочерней форме

Добавлено через 7 минут
Это как inputBox, ввёл данные, получил результат. Понадобилась новая форма, открыл новую. Или эту же, из функции. И все окна, общаются с родительской программой, как в C# к примеру, где окна по умолчанию отдают данные в основную программу, которая затем может из передать в другое окно.

Добавлено через 15 минут
$RunSpace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$RunSpace.ApartmentState = "STA"
$RunSpace.ThreadOptions = "ReuseThread"
$RunSpace.Open()
$RunSpace.SessionStateProxy.SetVariable("SyncHashTable", $Script:SyncHashTable)

Начало очень похоже на то, что требуется - создать новый поток.
Так как форма открылась, то можно сделать вывод, что она в новом потоке.
В основном потоке она представлена в виде переменной $RunSpace.
Теперь в дочерней форме нужно циклом пройтись по переменным основной программы, найти искомую переменную $x и отдать ей значение из TextBox.
Результат будет в основной форме где то в недрах $RunSpace - общей для потоков переменной. Ну не совсем переменной - объекту.

Добавлено через 4 минуты
В $PowerShellCmd вернее, не в $RunSpace, хотя от этих потоков всего можно ожидать.

Добавлено через 13 минут
Да. Форма работает в новом потоке.
В конце вашего примера дописал:
echo 'exit'
Основной поток написал exit и ...., ожидаемо закончил свою работу, так как он создал форму в другом потоке и она его больше не интересует.
Но нас то ... интересует.
Его нужно остановить циклом с паузой, чтобы оба потока работали одновременно.
Когда основной поток, получит результат из дочернего, цикл прервать и продолжить выполнение основного потока.
Форму можно закрывать, можно оставить открытой, для дальнейшей связи
И напротив - В основном же примере, с которого началась эта ветка, в примере S1aanesh - поток застопоривается и естественно ничего не получит, потому, что он не работает вообще.
0
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
11.12.2020, 00:43 13
Решение задачи оказалось банально простым. Нужна глобальная переменная $global:x.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$global:x=0
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
 
$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Определение сотрудника по телефону"
$objForm.Size = New-Object System.Drawing.Size(300,200) 
$objForm.StartPosition = "CenterScreen"
 
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$global:x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}})
 
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$global:x=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)
 
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Введите номер телефона сюда:"
$objForm.Controls.Add($objLabel) 
 
$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox.Size = New-Object System.Drawing.Size(260,20) 
$objForm.Controls.Add($objTextBox) 
 
$objForm.Topmost = $True
 
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
 
echo "Введён номер телефона: $global:x"
Добавлено через 33 минуты
Асинхронная форма:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$Script:SyncHashTable = [Hashtable]::Synchronized(@{'X'=0})
$RunSpace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$RunSpace.ApartmentState = "STA"
$RunSpace.ThreadOptions = "ReuseThread"
$RunSpace.Open()
$RunSpace.SessionStateProxy.SetVariable("SyncHashTable", $Script:SyncHashTable)
 
$PowerShellCmd = [Management.Automation.PowerShell]::Create().AddScript( {
        [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
        [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
 
        $Script:SyncHashTable.objForm = New-Object System.Windows.Forms.Form
        $Script:SyncHashTable.InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
        $Script:SyncHashTable.objForm.Size = New-Object System.Drawing.Size(340, 200)
        $Script:SyncHashTable.objForm.Name = "objForm"
        $Script:SyncHashTable.objForm.Text = "Test form"
 
        $Script:SyncHashTable.objLabel = New-Object System.Windows.Forms.Label
        $Script:SyncHashTable.objLabel.Location = New-Object System.Drawing.Size(10,20)
        $Script:SyncHashTable.objLabel.Size = New-Object System.Drawing.Size(320,20)
        $Script:SyncHashTable.objLabel.Text = "Введите данные и нажмите кнопку OK или клавишу Enter:"
        $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.objLabel)
 
        $Script:SyncHashTable.objTextBox = New-Object System.Windows.Forms.TextBox
        $Script:SyncHashTable.objTextBox.Location = New-Object System.Drawing.Size(10,40)
        $Script:SyncHashTable.objTextBox.Size = New-Object System.Drawing.Size(300,20)
        $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.objTextBox)
 
        $Script:SyncHashTable.objForm.KeyPreview = $True
        $Script:SyncHashTable.objForm.Add_KeyDown( { if ($_.KeyCode -eq "Enter") { $Script:SyncHashTable.X = $Script:SyncHashTable.objTextBox.Text } })
        $Script:SyncHashTable.objForm.Add_KeyDown( { if ($_.KeyCode -eq "Escape") { $objForm.Close() } })
 
        $Script:SyncHashTable.OKButton = New-Object System.Windows.Forms.Button
        $Script:SyncHashTable.OKButton.Location = New-Object System.Drawing.Size(75,120)
        $Script:SyncHashTable.OKButton.Size = New-Object System.Drawing.Size(75,23)
        $Script:SyncHashTable.OKButton.Text = "OK"
        $Script:SyncHashTable.OKButton.Add_Click( { $Script:SyncHashTable.X = $Script:SyncHashTable.objTextBox.Text } )
        $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.OKButton)
 
        $Script:SyncHashTable.InitialFormWindowState = $Script:SyncHashTable.objForm.WindowState
        $Script:SyncHashTable.objForm.add_Load($Script:SyncHashTable.OnLoadForm_StateCorrection)
        [void] $Script:SyncHashTable.objForm.ShowDialog()
    } )
 
$PowerShellCmd.Runspace = $RunSpace
$PowerShellCmd.BeginInvoke()
 
do {
    $Script:SyncHashTable.X
    if ($Script:SyncHashTable.X -ne 0){ break}
    Start-Sleep 2
} while ($Script:SyncHashTable.X -eq 0)
echo "Получен ответ из формы: "$Script:SyncHashTable.X
Добавлено через 17 минут
Вообще асинхронная форма - вещь, когда речь идёт о длительных операциях. Например видео. Пока User думает как назвать свой супер-пупер файл, основной поток его "сделает" и запишет во временную директорию. Остаётся только вырезать его в нужное место и с нужным именем.

Добавлено через 11 минут
Странно. Не заметил ответ iNNOKENTIY21, уже озвучивший глобальную переменную для однопоточного режима.
Браво.
Про однопоточную форму оказывается я лишь продублировал.
Многопоточную форму от iNNOKENTIY21 - привёл в "рабочее состояние".

Добавлено через 1 час 11 минут
Ещё одно, неожиданное для меня применение многопоточности. Есть у меня одно приложение, работающее с Excel, которое оставляет после себя процесс Excel незакрытым, и напрочь не хочет его закрывать ни при каких обстоятельствах.
Вычитал на одном из форумов, что чтобы он закрылся, нужно корректное завершение скрипта. Не Kill it однозначно.
Но у меня его окно явно лишнее среди взаимодействующих окон.
Попробую-ка я его в другой процесс запустить и закончить корректно до "убийства" основного процесса.
Ля. Итак после 2003 Экселя ничего хорошего с ним не сделали. Функционал тот же. Тормознутость в десятки раз больше, ещё и на ошибки чужие скрипты проверяют. Если это так, то они вообще ... чокнулись.

Добавлено через 30 минут
Убрал всплывающий в конце "MsgBox" - Excel стал закрываться в процессах. Здец!
0
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
11.12.2020, 15:05 14
В конце лучше заменить цикл на

PowerShell
1
2
3
4
5
6
7
8
$PowerShellCmd.Runspace = $RunSpace
$res=$PowerShellCmd.BeginInvoke()
do {
    $Script:SyncHashTable.X
    if ($Script:SyncHashTable.X -ne 0){ break}
    Start-Sleep 2
} while ($res.IsCompleted -eq $false )
echo "Получен ответ из формы: "$Script:SyncHashTable.X
... лучще бы вообще без цикла. Я знаю как это сделать, если бы это был полностью другой процесс, но здесь их PID одинаковы...

Добавлено через 4 часа 43 минуты
Всё. От цикла избавился.
Пользуйтесь.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$Script:SyncHashTable = [Hashtable]::Synchronized(@{})
$RunSpace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$RunSpace.ApartmentState = "STA"
$RunSpace.ThreadOptions = "ReuseThread"
$RunSpace.Open()
$RunSpace.SessionStateProxy.SetVariable("SyncHashTable", $Script:SyncHashTable)
$PowerShellCmd = [Management.Automation.PowerShell]::Create().AddScript({
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    
    $Script:SyncHashTable.objForm = New-Object System.Windows.Forms.Form
    $Script:SyncHashTable.InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
    $Script:SyncHashTable.objForm.Size = New-Object System.Drawing.Size(340, 200)
    $Script:SyncHashTable.objForm.Name = "objForm"
    $Script:SyncHashTable.objForm.Text = "Test form"
    
    $Script:SyncHashTable.objLabel = New-Object System.Windows.Forms.Label
    $Script:SyncHashTable.objLabel.Location = New-Object System.Drawing.Size(10,20)
    $Script:SyncHashTable.objLabel.Size = New-Object System.Drawing.Size(320,20)
    $Script:SyncHashTable.objLabel.Text = "Введите данные и нажмите кнопку OK или клавишу Enter:"
    $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.objLabel)
    
    $Script:SyncHashTable.objTextBox = New-Object System.Windows.Forms.TextBox
    $Script:SyncHashTable.objTextBox.Location = New-Object System.Drawing.Size(10,40)
    $Script:SyncHashTable.objTextBox.Size = New-Object System.Drawing.Size(300,20)
    $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.objTextBox)
    
    $Script:SyncHashTable.objForm.KeyPreview = $True
    $Script:SyncHashTable.objForm.Add_KeyDown( { if ($_.KeyCode -eq "Enter") { $Script:SyncHashTable.X = $Script:SyncHashTable.objTextBox.Text;$Script:SyncHashTable.objForm.Close() } })
    $Script:SyncHashTable.objForm.Add_KeyDown( { if ($_.KeyCode -eq "Escape") { $objForm.Close() } })
    
    $Script:SyncHashTable.OKButton = New-Object System.Windows.Forms.Button
    $Script:SyncHashTable.OKButton.Location = New-Object System.Drawing.Size(75,120)
    $Script:SyncHashTable.OKButton.Size = New-Object System.Drawing.Size(75,23)
    $Script:SyncHashTable.OKButton.Text = "OK"
    $Script:SyncHashTable.OKButton.Add_Click( { $Script:SyncHashTable.X = $Script:SyncHashTable.objTextBox.Text;$Script:SyncHashTable.objForm.Close() } )
    $Script:SyncHashTable.objForm.Controls.Add($Script:SyncHashTable.OKButton)
    
    $Script:SyncHashTable.InitialFormWindowState = $Script:SyncHashTable.objForm.WindowState
    $Script:SyncHashTable.objForm.add_Load($Script:SyncHashTable.OnLoadForm_StateCorrection)
    [void] $Script:SyncHashTable.objForm.ShowDialog()
    })
$PowerShellCmd.Runspace = $RunSpace
$obj=$PowerShellCmd.BeginInvoke()
#Пора получить наш пропавший объект $AsyncObject
$BindingFlags = [Reflection.BindingFlags]'nonpublic','instance'
$Field = $PowerShellCmd.GetType().GetField('invokeAsyncResult',$BindingFlags)
$AsyncObject = $Field.GetValue($PowerShellCmd)
Write-Host 'Здесь ваш код, который исполняется параллельно с кодом формы'
Write-Host '(любой длины и времени исполнения)'
Write-Host "`$PowerShellCmd.EndInvoke($AsyncObject) будет ждать результаты формы из формы,"
Write-Host "или подхватит их, если они будут уже готовы."
#Закроем пространство выполнения при получении результата
$PowerShellCmd.EndInvoke($AsyncObject)
'Получен ответ из формы: {0}' -f $Script:SyncHashTable.X
0
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
11.04.2021, 14:25 15
Можно несколько упростить логику возврата данных с формы, не используя промежуточные переменные, глобальные переменные, не присваивать им значения по клику, никаких $x, а просто ... закрыть форму по клику ... и смотреть уже потом, в основной программе, что же там было в возвращённой форме. Да. Именно в форме, которая уже не инициализирована, но имеет последние введённые в неё значения. Кроме того, её снова можно отправить на исполнение с прошлыми введёнными данными....
так как в данном случае, возвращается вся форма, все её значения, значения каждого элемента. (как то я не заметил этого ранее)
Кроме того, саму форму, в принципе можно создавать в основном потоке, а на исполнение отправлять в обработчик, возвращающий результат. Сам обработчик можно оформить как функцию, возможно внешнюю ... тут уж кто во что горазд.
Ниже код для формы в одном потоке, но нетрудно раскомментировать строки кода и установить $RunSpace.ThreadOptions = "ReuseThread" к примеру и код будет создавать новый поток.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
$ToForm='My Form Name'
$Script:Table = [Hashtable]::Synchronized(@{'ToForm'=$ToForm})#'$ToForm'=$ToForm- Пример проброски данных в форму
$RunSpace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$RunSpace.ApartmentState = "STA"
$RunSpace.ThreadOptions = "UseCurrentThread"
# Default - 0 - UseNewThread для локального пространства, ReuseThread для локального пула пространств, настройки сервера для всех удаленных пространств
# ReuseThread - 2 -  Создает новый поток для первого вызова, а затем повторно использует этот поток в последующих вызовах.
# UseCurrentThread - 3 - Не создает новый поток; выполнение происходит в потоке, который вызывает Invoke.
# UseNewThread - 1 -  Создает новый поток для каждого вызова
$RunSpace.Open()
$RunSpace.SessionStateProxy.SetVariable("Table", $Script:Table)
$PowerShellCmd = [Management.Automation.PowerShell]::Create().AddScript({
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    
    Write-Host $Script:Table.ToForm # Write-Host здесь не получится, да и вообще основной поток "стоит" если в одном потоке, но текст здесь
 
    $Script:Table.objForm = New-Object System.Windows.Forms.Form
    $Script:Table.InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
    $Script:Table.objForm.Size = New-Object System.Drawing.Size(340, 200)
    $Script:Table.objForm.Name = "objForm"
    $Script:Table.objForm.Text = $Script:Table.ToForm #Используем значение переменной из основной программы
    
    $Script:Table.objLabel = New-Object System.Windows.Forms.Label
    $Script:Table.objLabel.Location = New-Object System.Drawing.Size(10,20)
    $Script:Table.objLabel.Size = New-Object System.Drawing.Size(320,20)
    $Script:Table.objLabel.Text = "Введите данные и нажмите кнопку OK или клавишу Enter:"
    $Script:Table.objForm.Controls.Add($Script:Table.objLabel)
    
    $Script:Table.objTextBox = New-Object System.Windows.Forms.TextBox
    $Script:Table.objTextBox.Location = New-Object System.Drawing.Size(10,40)
    $Script:Table.objTextBox.Size = New-Object System.Drawing.Size(300,20)
    $Script:Table.objForm.Controls.Add($Script:Table.objTextBox)
    
    $Script:Table.objForm.KeyPreview = $True
    $Script:Table.objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$Script:Table.objForm.Close()}})
    $Script:Table.objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$Script:Table.objForm.Close()}})
    
    $Script:Table.OKButton = New-Object System.Windows.Forms.Button
    $Script:Table.OKButton.Location = New-Object System.Drawing.Size(75,120)
    $Script:Table.OKButton.Size = New-Object System.Drawing.Size(75,23)
    $Script:Table.OKButton.Text = "OK"
    $Script:Table.OKButton.Add_Click({$Script:Table.objForm.Close()} )
    $Script:Table.objForm.Controls.Add($Script:Table.OKButton)
    
    $Script:Table.InitialFormWindowState = $Script:Table.objForm.WindowState
    $Script:Table.objForm.add_Load($Script:Table.OnLoadForm_StateCorrection)
    [void] $Script:Table.objForm.ShowDialog()
    })
$PowerShellCmd.Runspace = $RunSpace
$obj=$PowerShellCmd.BeginInvoke()
#(Закомментированное можно не использовать если форма и прога в одном потоке,
# но при создании формы в новом, самостоятельном потоке (см. $RunSpace.ThreadOptions выше по коду), нужно раскомментировать)
#Пора получить наш пропавший объект $AsyncObject 
#$BindingFlags = [Reflection.BindingFlags]'nonpublic','instance'
#$Field = $PowerShellCmd.GetType().GetField('invokeAsyncResult',$BindingFlags)
#$AsyncObject = $Field.GetValue($PowerShellCmd)
#Start-Sleep -milliseconds 800;Write-Host 'Здесь ваш код, который исполняется параллельно с кодом формы'
#Start-Sleep -milliseconds 800;Write-Host 'Это было напечатано, когда вы уже смотрели форму'
#Start-Sleep -milliseconds 800;Write-Host '(любой длины и времени исполнения)'
#Start-Sleep -milliseconds 800;Write-Host "`$PowerShellCmd.EndInvoke($AsyncObject) будет ждать результаты формы из формы,"
#Start-Sleep -milliseconds 800;Write-Host "или подхватит их, если они будут уже готовы."
#$PowerShellCmd.EndInvoke($AsyncObject) #Закроем пространство выполнения при получении результата
'Получен ответ из формы: {0}' -f $Script:Table.objTextBox.Text; #Здесь мы можем получить любой элемент формы
$Script:Table=$null
Write-Host $Script:Table
0
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
11.04.2021, 22:21 16
@Garric спасибо за вариант . помоему такой подход страдает от необходимости раскапывать потом после форма уже закрылась детали ввода
которые могут быть запутаны ! например пользователь ввел интервал дат через календарь System.Windows.Forms.MonthCalendar а может фиксированный интервал через лист System.Windows.Forms.ListBox в котором выброано "последние две недели" и тому подобное - пример из реального приложения в котором еще всякие логины пароли энвайроменты и дата центры и другое - в обработчиках событий такие сценарии обрабатываются проще
0
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
12.04.2021, 23:17 17
Вот, что я нашёл в инете. То же без промежуточных переменных. В принципе - рабочая версия той, нерабочей версии, с которой начинался топик.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
 
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Data Entry Form'
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = 'CenterScreen'
 
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,120)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)
 
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,120)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)
 
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Please enter the information in the space below:'
$form.Controls.Add($label)
 
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox)
 
$form.Topmost = $true
 
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()
 
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $x = $textBox.Text
    $x
}
Добавлено через 55 секунд
skouzmine. Не вижу разницы. Причём вообще никакой разницы. Логика проверки введённых значений не изменится в любом случае.
А вот логика присвоения значения поля определённой, строго заданной переменной, причём в разных событиях одновременно будет отсутствовать. Причём всё это сваливается сверху на проверку введённых значений, событий, необходимости обновлять значения в связанных полях ввода/вывода. Это очень сложный подход.
0
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
13.04.2021, 01:19 18
когда пользоваель хочет чтоб во время выбора парметров происходила бизнес логика то делать приходится в обработчике событий а не потом
0
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
16.04.2021, 01:10 19
Само собой в обработчике. Проверил, не понравилось подкрасил или стёр поле, что такого. В чём твой смысл защищать глупую бессмысленную операцию копирования вывода в отдельную переменную?

Добавлено через 12 минут
У меня складывается ощущение, что вы воспринимаете форму, возможно на основе опыта в Visual Studio, как нечто особенное, стоящее над или под кодом, так как имеет нечто вроде своего отдельного файла в Visual Studio.
Нет, это просто код.
Стерите все строчки формы из моего кода и вставьте обычный $Script:Table.x='Hello Word', и получайте результат в основной программе из параллельного потока.
Она придёт оттуда как $Script:Table.x.
Забрасывается туда $Script:Table = [Hashtable]::Synchronized(@{'x'=$x})

Добавлено через 7 минут
И когда вы поймёте, как это работает, то вы заметите, что рядом могут находится многочисленные переменные формы $Script:Table.objTextBox.Text и т.д. Но если они все присутствуют вместе, для чего копирование?
0
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
17.04.2021, 05:49 20
честно говоря, из вашего поста тяжело понять вашу мысль и что-то вы меня не убедили..
0
17.04.2021, 05:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2021, 05:49
Помогаю со студенческими работами здесь

Используя диалоговые окна ввода и вывода необходимо создать web- страницу для вычисления значений функций
Используя диалоговые окна ввода и вывода создать web- страницу для вычисления значений функций.

Организация ввода/вывода информации
Всем здравствуйте! Уже пол дня бъюсь над заданием:umnik: сил больше нет, жду помощи профессионала:)...

Контроль ввода вывода информации
Помоги пожалуйста как написать так что если пользователь вводит информацию не правильно то...

Вопрос: создание окон (в графическом или текстовом режиме) для ввода исходной информации.
Подскажите пожалуйста. Никак не могу сообразить как сделать маленькие окошки в программе для ввода...

Неполадки ввода-вывода информации с диска
Купил жесткий диск. Будучи первостатейным джентльменом удачи, уронил его в тот же день примерно с...

Компоненты ввода-вывода текстовой информации
Выполнить преобразование текста. В каждом рядке первую букву переместить в конец рядка. Можете...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru