Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Приложение после закрытия остается висеть в процессах

Есть программа, создающая новое полноэкранное окно и выполняющая некоторые действия. Основной код программы:

program prog;

uses
  windows,
  messages,
  window in 'window.pas';

{$APPTYPE GUI}

var
  window: TWindow;
  stop: Boolean = false;

begin
  window := TWindow.create("myProg");

  while (not stop) do begin
    sleep(10);
    stop := not window.update();
  end;

  window.free();
end.


Код модуля "window.pas":
unit window;

interface

uses
  windows, messages, sysUtils;

type
  TWindowError = class(Exception);

  TWindow = class(TObject)
  private
    FName: String;
    FHandle: HWnd;
  public
    constructor create(name: String); virtual;
    destructor destroy(); override;
    function update(): boolean;
  end;

implementation

function wndProc(window: HWnd; msgId, wParam, lParam: LongInt): LongInt; stdcall; export;
var
  msg: TMessage;
begin
  msg.msg := msgId;

  case msgId of
    WM_DESTROY: postQuitMessage(0);
  else
    wndProc := DefWindowProc(window, msgId, wParam, lParam);
    exit();
  end;

  result := msg.Result
end;

constructor TWindow.create(name: String);
var
  wndClass: TWndClass;
begin
  FName := name;

  wndClass.style := CS_HREDRAW or CS_VREDRAW;
  wndClass.cbClsExtra := 0;
  wndClass.cbWndExtra := 0;
  wndClass.hInstance := hInstance;
  wndClass.hIcon := loadIcon(0, IDI_INFORMATION);
  wndClass.hCursor := loadCursor(0, IDC_ARROW);
  wndClass.hbrBackground := hBrush(getStockObject(BLACK_BRUSH));
  wndClass.lPszMenuName := nil;
  wndClass.lPszClassName := PWideChar(name);
  wndClass.lpfnWndProc := @wndProc;

  if (registerClass(wndClass) <> 0) then begin
    FHandle := createWindow(
      PWideChar(name),
      PWideChar(name),
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      0,
      0,
      hInstance,
      nil
    );

    if (FHandle <> 0) then begin
      setWindowLong(FHandle, GWL_STYLE, WS_POPUP);
      showWindow(FHandle, SW_MAXIMIZE);
    end
    else TWindowError.create('Не удается создать окно.');
  end
  else
    raise TWindowError.create('Не удается зарегистрировать класс.');
end;

destructor TWindow.destroy();
begin
  destroyWindow(FHandle);

  inherited;
end;

function TWindow.update(): boolean;
var
  msg: TMsg;
begin
  result := true;

  while (peekMessage(msg, FHandle, 0, 0, 0)) do begin
    if (getMessage(msg, FHandle, 0, 0)) then begin
      translateMessage(msg);
      dispatchMessage(msg);

      if (msg.message = WM_DESTROY) then
      exit(false);
    end;
  end;
end;

end.


Проблема в том, что программа при закрытии окна остается висеть в диспетчере задач - видимо, цикл работает, не проходит до этой строки:

window.free();


А это значит, что метод "TWindow.update" не возвращает false, хотя должен при получении "WM_DESTROY"... В чем я ошибся?
Ответ:
amadeus
Оставил такой код в этой функции

Прелестно... Т.е. ты вообще забил на процитированное мною "функция должна возвращать..."
или просто не смог это прочитать?..

Posted via ActualForum NNTP Server 1.5

Вопрос: Сохранение данных приложения после закрытия

Здравствуйте. Мне нужно чтобы после закрытия приложения у меня сохранялись данные в QListWidget. У меня есть QListWidget в который я определенным образом записываю текст и ставлю иконку, теперь мне нужно сделать так, чтобы все элементы сохранились после закрытия и появились при след. открытии. Слышал , что нужно использовать QSettings , предварительно записав данный из QListWidget в QList, но что дальше понятия не имею, пожалуйста, как можно более доходчиво и понятно объясните как мне сделать это) я новичек и чем подробнее , тем лучше) Спасибо)
Ответ:
Сообщение от sashatref
mevn, нет причины создавать QSettings в куче. Но даже если так делаете, нужно удалять за собой мусор
Прошу прощения, нужно добавить
C++ (QT)
1
delete settings;
Вопрос: После закрытия приложения процесс не завершается

Сделал приложение для работы с HID устройствами. Всё что мне необходимо она выполняет, НО когда нажимаю "Подключиться" событие buttonConnect_Click и после этого закрываю приложение в диспетчере задач висит процесс и убивается только вручную через этот самый диспетчер.
Вроде всё по порядку делаю, при закрытии формы использую usb.stopRead(); usb.Disconnect(); а толку ноль.
Как корректно завершить программу?

Кликните здесь для просмотра всего текста
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
using System;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using USBHIDDRIVER;
 
namespace WindowsFormsApplication_HID
{
    public partial class Form1 : Form
    {
        //Работа с USB HID
        USBHIDDRIVER.USBInterface usb;
        byte[] currentRecord = null;
 
        int InBase = 2; //Основание системы счисления для вывода в richTextBox_IN
        int OutBase = 10; //Основание системы счисления для вывода на устройство
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void buttonConnect_Click(object sender, EventArgs e)
        {
            if (usb == null)
            {
                ConnectDevice();
            }
        }
 
        void ConnectDevice()
        {
            usb = new USBInterface("vid_" + textBox_VID.Text, "pid_" + textBox_PID.Text); //Ищем USB HID устройство
            Thread.Sleep(5);
 
            if (usb.Connect()) //Если подключились
            {
                usb.enableUsbBufferEvent(new System.EventHandler(usbEventCacher)); //Событие срабатывает если с устройства пришли данные
                usb.startRead(); //Запускаем чтение с устройства
                Thread.Sleep(5);
 
                labelHIDStatus.Text = "HID устройство успешно подключено";
                labelHIDStatus.ForeColor = System.Drawing.Color.Green;
            }
            else
            {
                labelHIDStatus.Text = "HID устройство не подключено к ПК";
                labelHIDStatus.ForeColor = System.Drawing.Color.Red;
            }
        }
 
        //Вывод системного времени в статус бар
        public void GetSysTime()
        {
            while(true)
            {
                if (!toolStripStatusTime.IsDisposed)
                {
                    toolStripStatusTime.Text = DateTime.Now.ToString("hh:mm:ss:fff"); //Выводим время в статус бар
                    Thread.Sleep(100); //Задержка 100 мсек
                }
 
            }
        }
 
        //Событие вызывается когда будет принят новый набор данных
        public void usbEventCacher(object sender, System.EventArgs e)
        {
            if (USBHIDDRIVER.USBInterface.usbBuffer.Count > 0)
            {
                int counter = 0;
                while ((byte[])USBHIDDRIVER.USBInterface.usbBuffer[counter] == null)
                {
                    //Remove this report from list
                    lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                    {
                        USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                    }
                }
                //since the remove statement at the end of the loop take the first element
                currentRecord = (byte[])USBHIDDRIVER.USBInterface.usbBuffer[0];
                lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                {
                    USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                }
            }
 
            //Вывод получаемых данных от HID устройства в richTextBox_IN
            if (richTextBox_IN.IsHandleCreated && !richTextBox_IN.IsDisposed)
            {
                richTextBox_IN.Invoke((MethodInvoker)(() => richTextBox_IN.AppendText(DateTime.Now.ToString("hh:mm:ss:fff") + "\t" + ArrToString(currentRecord, InBase) + "\r\n")));
            }
        }
 
        //Преобразование массива byte[] в строку в формате DEC, HEX или BIN
        static string ArrToString(byte[] bytes, int toBase)
        {
            if (bytes == null || bytes.Length == 0) return "";
 
            StringBuilder sb;
            if (toBase == 2)
            {
                sb = new StringBuilder(bytes.Length * 8 + bytes.Length);
                for (int i = 0; i < bytes.Length; ++i) sb.Append(Convert.ToString(bytes[i], 2).PadLeft(8, '0')).Append("     ");
            }
            else if (toBase == 10)
            {
                sb = new StringBuilder(bytes.Length * 3 + bytes.Length);
                for (int i = 0; i < bytes.Length; ++i) sb.Append(bytes[i].ToString()).Append("     ");
            }
            else if (toBase == 16)
            {
                sb = new StringBuilder(bytes.Length * 2 + bytes.Length);
                for (int i = 0; i < bytes.Length; ++i) sb.Append(bytes[i].ToString("X2")).Append("     ");
            }
            else throw new ArgumentOutOfRangeException("toBase", "toBase must be one of the following: 2, 10, 16.");
 
            sb.Length -= 5; // Убираем пять лишних пробелов в конце строки
            return sb.ToString();
        }
 
        //Преобразование строки в формате DEC, HEX или BIN в byte[]
        static byte[] StringToArr(string bytes, int toBase)
        {
            byte[] bytesToOut = null;
            if (bytes == null || bytes.Length == 0) return bytesToOut;
 
            bytes = System.Text.RegularExpressions.Regex.Replace(bytes, @"\s+", ""); //удаление всех пробелов
 
            //Перевод из двоичного представления в byte[]
            if (toBase == 2)
            {
                if (bytes.Length % 8 == 0) //Если введено кол-во цифр кратных размеру байта
                {
                    byte tmp = 0;
                    int j = 0;
                    while (bytes.Length > 0) //В цикле переводим строку в массив байтов
                    {
                        tmp = Convert.ToByte(bytes.Substring(0, 8), 2); //Конвертируем в байт
                        Array.Resize(ref bytesToOut, j + 1); //увеличиваем массив на 1
                        bytesToOut[j] = tmp; //записиваем байт в массив
                        bytes = bytes.Remove(0, 8); //удаляем уже сконвертированные символы из строки
                        j++;
                    }
                }
                else
                {
                    MessageBox.Show("Последний байт не полный.\r\nИсправьте ошибку и попробуйте снова.");
                    bytesToOut = null;
                }
            }
            //Перевод из десятичного представления в byte[]
            else if (toBase == 10)
            {
                bytesToOut = bytes.Select(ch => (byte)(ch - '0')).ToArray();
            }
            //Перевод из шестнадцатиричного представления в byte[]
            else if (toBase == 16)
            {
                if (bytes.Length % 2 == 0)
                {
                    byte tmp = 0;
                    int j = 0;
                    while (bytes.Length > 0) //В цикле переводим строку в массив байтов
                    {
                        tmp = Convert.ToByte(bytes.Substring(0, 2), 16); //Конвертируем в байт
                        Array.Resize(ref bytesToOut, j + 1); //увеличиваем массив на 1
                        bytesToOut[j] = tmp; //записиваем байт в массив
                        bytes = bytes.Remove(0, 2); //удаляем уже сконвертированные символы из строки
                        j++;
                    }
                }
                else
                {
                    MessageBox.Show("Последний байт не полный.\r\nИсправьте ошибку и попробуйте снова.");
                    bytesToOut = null;
                }
            }
            else throw new ArgumentOutOfRangeException("toBase", "toBase must be one of the following: 2, 10, 16.");
 
            return bytesToOut;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread timeThread = new Thread(new ThreadStart(GetSysTime)); //Создаём поток
            timeThread.IsBackground = true; //Работа в фоне
            timeThread.Priority = ThreadPriority.BelowNormal; //Приоритет ниже среднего
            timeThread.Start(); //Старт потока в котором получаем время
        }
 
        //Получить список всех подключенных HID устройств
        private void richTextBoxDevices_MouseClick(object sender, MouseEventArgs e)
        {
            USBHIDDRIVER.USBInterface usbI = new USBInterface("0");
            String[] list = usbI.getDeviceList();
            richTextBoxDevices.Clear();
            
            //проверка пустого list
            if (list != null)
            {
                richTextBoxDevices.Lines = list; //вывести список устройств в richTextBoxDevices
            }
            
        }
 
        //Отправка данных на HID устройство
        private void buttonSend_Click(object sender, EventArgs e)
        {
            byte[] bytes = StringToArr (textBox_Out.Text, OutBase); //Преобразование строки в массит байт для отправки в МК
 
            if (bytes != null) //Если массив байт не пустой
            {
                usb.stopRead();
                usb.write(bytes); //Передать массив байт на HID устройство
                if(pauseToolStripMenuItem.Text == "Пауза")
                {
                    usb.startRead();
                }
            }
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if(usb != null)
            {
                usb.stopRead();
                usb.Disconnect();
            }
        }
 
        private void radioButtonInHex_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButtonInHex.Checked)
            {
                InBase = 16;
            }
        }
 
        private void radioButtonInDec_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButtonInDec.Checked)
            {
                InBase = 10;
            }
        }
 
        private void radioButtonInBin_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButtonInBin.Checked)
            {
                InBase = 2;
            }
        }
 
        private void radioButtonOutDec_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButtonOutDec.Checked)
            {
                OutBase = 10;
            }
        }
 
        private void radioButtonOutHex_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButtonOutHex.Checked)
            {
                OutBase = 16;
            }
        }
 
        private void radioButtonOutBin_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButtonOutBin.Checked)
            {
                OutBase = 2;
            }
        }
 
        private void clearHidListToolStripMenuItem_Click(object sender, EventArgs e)
        {
            richTextBoxDevices.Clear();
        }
 
        private void InputListToolStripMenuItem_Click(object sender, EventArgs e)
        {
            richTextBox_IN.Clear();
        }
 
        private void pauseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (usb.IsStartRead == false)
            {
                usb.startRead();
                pauseToolStripMenuItem.Text = "Пауза";
            }
            else if (usb.IsStartRead == true)
            {
                usb.stopRead();
                pauseToolStripMenuItem.Text = "Старт";
            }
 
        }
    }
}
Ответ: bax_tang, как мне кажется приоритет вообще не должен влиять на освобождение ресурсов)) Я имел в виду строку 9 ))
Вопрос: Глобальная константа в qt после закрытия приложения выдает ошибку

Добрый вечер, вообщем всегда использовал макросы #define для всяких общих вещей типа размеров массивов, флагов отладки и т.д., но решил сделать глобальные константы и наткнулся на то, что приложение после закрытия вылезает ошибка.

в globals.h определяю константу
Код C++ (QT)
1
extern const QString c_nameDataBase = "\\testDataBase.sqlite";
в хедере класса
Код C++ (QT)
1
extern const QString c_nameDataBase;
если убрать const , т.е.
в globals.h определяю
Код C++ (QT)
1
QString c_nameDataBase = "\\testDataBase.sqlite";
в хедере класса
Код C++ (QT)
1
extern QString c_nameDataBase;
то всё работает нормально.

С чем связано?Что не так?
Ответ: Ладушки. Я не настаиваю. У меня работает как я вон в первый раз писал (вне зависимости от константности и наличия cpp). Использовать механизм передачи переменной между единицами трансляции для передачи внутри одной единицы трансляции, мне кажется неразумно. Но это лишь мое мнение, если работает, то и черт с ним.
Вопрос: Не сохраняются куки после закрытия браузера!

куки уничтожаются после закрытия браузера (проверено на chrome, edge,explorer,mozila).Пожалуйста скажите почему так получается, может это из за сервера xampp?
PHP
1
2
setcookie('tel',$_POST['tel']);
setcookie('code',$_POST['conf']);
Ответ: Я хотел использовать ссесию но после закрытие бравзера они удаляются. Есть какое нибудь решения?
Вопрос: Как закрыть процесс Excel?

Добрый день.
Не могу решить следующую проблему:
Создаю экземпляр Excel, открываю файл, закрываю его. В результате в task manager все равно остается висеть процесс Excel.exe. Он пропадает только после полного закрытия приложения.
Вот код:

Код C#
1
2
3
4
5
 Microsoft.Office.Interop.Excel.Application excelapp = new Microsoft.Office.Interop.Excel.Application();
            excelapp.Workbooks.Open(System.Windows.Forms.Application.StartupPath + "\\Шаблон1.xlsx", Type.Missing, false, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing,
                 Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)
 
excelapp.Quit();
Подскажите пожалуйста как закрыть так, чтобы из процессов также убралось?
Ответ: Так как вопросы ещё есть, хочу попробовать подвести итог, моей эпопеи с не убиваемым(на самом деле убиваемым) Excel приложением.
Вообще если есть возможность (Если нужно, например, забить ячейки Excel какой-нибудь инфой) то я бы советовал использовать SQL запросы.
Если же нужно редактировать стиль ячеек (границы, свет и т.д. и т.п.) то без библиотеки
Microsoft.Office.Interop.Excel не обойтись
Ну и так об Microsoft.Office.Interop.Excel,
Вот мой кодик. Всё отлажено, Excel процесс не висит.
Всё хорошо работает, если приложение уже было открыто, если приложение не было открыто и если в процессе работы нашей программы пользователь открыл другу книгу.
Такс такс, что ещё... Библиотеку Microsoft.Office.Interop.Excel я использовал версии 12. Специально использовал относительно старенькую версию. В других версиях работа с книгами, листами, ячейками может отличаться. Точно помню, что в 14 версии по-другому выбираются ячейки.
Раньше PhoenixJack писал Сборщик мусора не срабатывает, если есть ссылки на приложение Excel.Вот в примере.
Я давно это пробовал, но почему-то у меня всё равно процесс висел в памяти. Может не все ссылки удалял, а может, чем чёрт не шутит, зависит и от версии библиотеки Microsoft.Office.Interop.Excel
Ну в общем вот:
Код 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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;   
using System.Runtime.InteropServices;
 
namespace KILLEXCEL
{
    public partial class Form1 : Form
    {
        public Excel.Application excelApp;          
        public Excel.Range excelCells;
        public Excel.Sheets excelSheets;
        public Excel.Worksheet excelWorkSheet;
        public Excel.Workbooks excelAppWorkbooks;
        public Excel.Workbook excelAppWorkbook;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {// Присоединение к открытому приложению Excel (если оно открыто), имхо так тру, ибо 2 excel процесса в памяти не кошерно
                excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
            }
            catch
            {
                excelApp = new Excel.Application(); // Если нет открытого, то создаём новое приложение
            }
            excelApp.Visible = true;                // Делаем приложение видимым
            excelApp.SheetsInNewWorkbook = 3;       // В новой созданной книге будет 3 листа
            excelApp.Workbooks.Add(Type.Missing);   // Добавляем книгу
            excelAppWorkbooks = excelApp.Workbooks; // Получаем список открытых книг
            excelAppWorkbook = excelAppWorkbooks[excelAppWorkbooks.Count];  // Устанавливаем ссылку на нашу книгу и да именно Count, а не Count-1, так как отсчёт идёт с 1!!!!!!
            excelSheets = excelAppWorkbook.Worksheets; // Получаем список листов в нашей книге
            excelWorkSheet = (Excel.Worksheet)excelSheets.get_Item(1);  // Берем первый лист
            excelCells = excelWorkSheet.get_Range("A1", "A1");          // Берём ячейку А1
            excelCells.Value2 = "HiCyberForum";                         // Пишем в неё что-нибудь
            // Далее опишу закрытие, для того что-бы не висел процесс в памяти, нужно обнулить ВСЕ! ссылки, которые связаны с библиотекой Microsoft.Office.Interop.Excel
            excelCells = null;
            excelWorkSheet = null;
            excelSheets = null;
            try
            {// Тут уж простите за заплатку, выпадало исключение, если файл с таким именем существует и пользователь откажется перезаписывать его
                // Не знаю почему, времени нет разбираться.
                excelAppWorkbook.Save();
            }
            catch { }
            excelAppWorkbook.Close(false, false, false);// Закрываем книгу
            excelAppWorkbooks = excelApp.Workbooks;     // Далее проверяем есть ли ещё другие открытые книги, ведь во время работы нашей программы пользователь мог открыть другую книгу
            if (excelAppWorkbooks.Count == 0)
                excelApp.Quit();            // Если нет то закрываем приложение
            excelAppWorkbook = null;        // Продолжаем обнулять ссылки
            excelAppWorkbooks = null;
            excelApp = null;
            GC.Collect();       // Зовём МистераПропера на помощь
            // С MSDN: Сборке мусора подвергаются все объекты, вне зависимости от времени их нахождения в памяти. Однако объекты, на которые имеются ссылки в управляемом коде, не освобождаются. Используйте этот метод, чтобы принудительно предпринять попытку высвободить максимальный объем доступной памяти.
        }
    }
}
Вопрос: Освобождение памяти после закрытие данных в Делфи

Мир всем и привет !
как освободит, очищать память приложение после

Delphi
1
FDQuery.close;
?
Ответ: Проблема похожая:
В цикле перебирается небольшая (57000 записей), но с блобами, таблица mssql и эти данные пишутся в таблицу PG. Процесс не быстрый и выжирает всю память - видно как ступеньками увеличивается занимаемый объем. Я специально эти 57000 записей запрашиваю по 1000 и после каждой вставки коммит - один фиг. Хотя признаться до "Out of memory" не доходило.
Как сделать, чтобы память возвращалась опять в работу?

Delphi
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
var
  i: integer;
begin
  for i := 1 to 57 do
  begin
    FDQuery2.Close;
    FDQuery2.ParamByName('cnt').AsInteger := i;
    FDQuery2.Open();
 
    FDQuery2.First;
    while not FDQuery2.Eof do
    begin
      with FDQuery1 do
      begin
        Close;
        ParamByName('blob_data').LoadFromStream(FDQuery2.CreateBlobStream(FDQuery2.FieldByName('blob_data'),
                                                                                                         TBlobStreamMode.bmRead), ftBlob);
        ExecSQL;
        FDConnection2.Commit;
      end;
 
      FDQuery2.Next;
    end;
  end;
end;
Вопрос: Приложение, позволяющее просматривать информацию о процессе

Нужно создать приложение, позволяющее просматривать информацию о процессе, к системным каталогам Windows.
Дополнительные WinAPI функции: GetClipCursor, GetKeyboardType, GetUserDefaultLCID, ShowCursor
Ответ:
Сообщение от Влад17081
просматривать информацию о процессе, к системным каталогам Windows
Уточниете, о чём идёт речь.
Вопрос: После закрытия Excel процесс остается

Я сразу извеняюсь перед теми, кому покажется этот вопрос ламерским.
Формирую в одной процедуре(клик на кнопку)отчёт в Excel. В этой же процедуре пишу такие строки
Dim oExcel As Excel.Application
Set oExcel = CreateObject('Excel.Application')
... тут идёт заполнение ячеек цифрами и словами и рисование рамок
Set oExcel = Nothing ' последняя строчка
Данные, которые заношу в таблицу Excel забираю из базы Access.
НО!!! При первой оброботке этого события (нажатия на кнопку и формирования отчёта) всё формируется так как надо: и данные где надо центрируються, и у ячеек рамочки рисуются. А когда нажимаешь на кнопку следуюший раз, то получаеться такая фигня:
1. Если я не закрываю окно с Excel от предыдущего отчёта, то отчет формтруеться, но ничего где надо не центрируется и рамки ячеек не рисуються.
2. Если я закрываю окно с Excel то VB пишет ошибку на таком месте
Visual Basic
1
2
3
4
5
6
7
8
9
10
 oExcel.Range('A6:H6').Select
    oExcel.ActiveCell.FormulaR1C1 = 'Смета'
    With oExcel.Selection
        .HorizontalAlignment = xlCenter ' ВОТ ЗДЕСЬ ОСТАНАВЛИВАЕТСЯ
        .VerticalAlignment = xlVAlignCenter
        .WrapText = True
        .Orientation = 0
        .ShrinkToFit = False
        .MergeCells = True
    End With 'Selection
Я посмотрел что в момент остановки Selection = Nothing, хотя я строчкой выше я явно выделил область.

И ещё непонятно почему после закрытия Excel с отчётом в памяти висит oExcel(по Ctrl+Alt+Del, на панеле задач его нет). Я ж явно обнуляю объект oExcel в конце процедуры????????

Заранее благодарен кто откликнется на мой вопрос!!! :-)))
Ответ:
Сообщение от DjinnWalker
Visual Basic
1
2
3
4
5
'потом пример вызова
'стартуем Эксель
Call StartExcel(True)
With ExcelApp
.Workbooks.Add App.Path & 'XltTimeTable.xlt'
Затыкается на строке
Visual Basic
1
.Workbooks.Add App.Path & 'XltTimeTable.xlt'
"Object variable or With block variable not set"

Добавлено через 3 часа 59 минут
Сообщение от plohish
Затыкается на строке
Visual Basic
1
.Workbooks.Add App.Path & 'XltTimeTable.xlt'
"Object variable or With block variable not set"
Разобрался (в моём проекте был модуль с названием "ExcelAPP" не сразу заметил)...теперь всё в порядке, с небольшими доработками код работает неплохо.
Вопрос: Почему после закрытия второй формы главная не появляется?

Привет, это снова я.
Наблюдается странное поведение программы. После закрытия второй формы главная не появляется, программа висит в процессах. Это происходит только иногда, и замечено как раз на том компе, для которого предназначалась. (Виндовс ХР).
На восьмерке ни разу такого не было. Может кто знает, что это и как это исправить?
C#
1
2
3
4
5
6
private void button_исправить_Click(object sender, EventArgs e)
        {
            form2 = new Form2(); 
            form2.Show();
            this.Hide();
        }
C#
1
2
3
4
5
6
7
8
 private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            // вызываем главную форму приложения
             Form form1 = Application.OpenForms[0];
           // Form form1 = new Form1(); 
            form1.Show();
            this.Hide();
        }
Ответ: Работал иногда с несколькими формами без всяких осложнений.
Нужно только код перехода, например, с формы1 на форму2 использовать всегда при переходе с данной формы на любую другую

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Forms Code
{
       private void button1_Click(object sender, EventArgs e)
       {
          Form2 f2 = new Form2();
           f2.Show();
            this.Hide();
       }
 
   //Переход с 5 на 8
       private void button1_Click(object sender, EventArgs e)
       {       
         Form8 f8 = new Form8();
          f8.SHOW();
           this.Hide();    
        }
}