Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115

Вывод ответа на отдельную форму

24.10.2016, 08:14. Показов 2893. Ответов 38

Студворк — интернет-сервис помощи студентам
В общем есть программа всё работает. Смысл загружает таблицу Excel но загружает долго. Обычному пользователю не очень понятно когда завершилась загрузка,нужно сделать ,чтобы было написано что загрузка завершена. Потом при нажатии на кнопку фильтр выводит ответы выводится в неудобном консольном окне. И всё сплошником можно как нибудь облагородить. Вот код
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
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
unit class_fMain;
 
interface
 
uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Variants,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  Grids,
  ComObj,
  StdCtrls;
 
 
 
type
  TfMain = class(TForm)
    sgExcel: TStringGrid;
    btnOpenFile: TButton;
    OpenDlg: TOpenDialog;
    btnFind: TButton;
    Label1: TLabel;
    procedure btnOpenFileClick(Sender: TObject);
    procedure btnFindClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  fMain: TfMain;
 
implementation
 
{$R *.dfm}
 
procedure Xls_Open(XLSFile:string; Grid: TStringGrid);
//Ñ÷èòûâàåò Excel â StringGrid.
const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
  i, j, r, c: Integer;
begin
  ExlApp := CreateOleObject('Excel.Application');
  try
    ExlApp.Visible := false;
    ExlApp.Workbooks.Open(XLSFile);
    Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    r := ExlApp.ActiveCell.Row;
    c := ExlApp.ActiveCell.Column;
    Grid.RowCount:=r;
    Grid.ColCount:=c;
     for j:= 1 to r do
       for i:= 1 to c do
         Grid.Cells[i-1,j-1]:= sheet.cells[j,i];
  finally
    ExlApp.Quit;
    ExlApp := Unassigned;
    Sheet := Unassigned;
  end;
end;
 
 
procedure AutoSizeGridColumn(Grid : TStringGrid; Column : Integer);
//Àâòîðàçìåð êîëîíîê StringGrid ïîä øèðèíó òåêñòà.
var
  I : Integer;
  Temp : Integer;
  Max : Integer;
begin
  Max := 0;
  for i := 0 to (Grid.RowCount - 1) do
  begin
    Temp := Grid.Canvas.TextWidth(Grid.Cells[Column, I]);
    if Temp > Max
      then Max := Temp;
  end;
  Grid.ColWidths[Column] := Max + Grid.GridLineWidth + 10;
end;
 
 
procedure TfMain.btnOpenFileClick(Sender: TObject);
var
  X: Integer;
begin
  OpenDlg.InitialDir:=ExtractFilePath(ParamStr(0));
  if OpenDlg.Execute then
    begin
      Xls_Open(OpenDlg.Files[0], sgExcel);
      for x := 0 to sgExcel.ColCount-1 do
        AutoSizeGridColumn(sgExcel, x);
    end;
end;
 
procedure TfMain.btnFindClick(Sender: TObject);
type
  Rec = record
    sgLine: Integer;
    cData: String;
    sData: String;
    fCount: Integer;
end;
 
var
  x: Integer;
  cache: array of Rec;
 
procedure FillData(Col1, Col2: String; Addr: Integer);
var
  I: Integer;
  Found: Boolean;
begin
  Found:=False;
  for I := Low(cache) to High(Cache) do
    begin
      if
        (Cache[i].cData = trim(lowercase(Col1))) and
        (Cache[i].sData = trim(lowercase(Col2)))
      then
        begin
          Inc(Cache[i].fCount);
          Found:=True;
          Break;
        end;
    end;
  if not Found then
    begin
      SetLength(Cache, Length(Cache)+1);
      Cache[Length(Cache)-1].cData:=Trim(Lowercase(Col1));
      Cache[Length(Cache)-1].sData:=Trim(Lowercase(Col2));
      Cache[Length(Cache)-1].fCount:=1;
      Cache[Length(Cache)-1].sgLine:=Addr;
    end;
end;
 
begin
  //Îòôèëüòðóåì íóæíûå çíà÷åíèÿ ïî  ïî 3 è 7-é êîëîíêå îäíîâðåìåííî.
  for x := 1 to sgExcel.RowCount-1 do FillData(sgExcel.Cells[3,x], sgExcel.Cells[7,x], x);
  //Ïîêàæåì ãäå ó íàñ íóæíûå çíà÷åíèÿ.
  for x := Low(cache) to High(cache) do
    if cache[x].fCount > 1
      then MessageBox
        (
          Handle,
          pChar(Format('Çíà÷åíèÿ: [%d], %s, êîëè÷åñòâî: %d',
            [
              cache[x].sgLine,
              cache[x].cData + ' ' +  cache[x].sData,
              cache[x].fCount
            ])),
          pChar(fMain.Caption),
          MB_ICONINFORMATION or MB_OK
        );
end;
 
 
 
end.
Миниатюры
Вывод ответа на отдельную форму  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.10.2016, 08:14
Ответы с готовыми решениями:

Вывод введенных данных на отдельную форму
Здравствуйте. Нужно, чтобы при нажатии кнопки "Добавить" все введенные в edit и заданные в radiogroup данные выводились в отдельную (4)...

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

Вывод ответа от сервера на форму Angular
Как подписаться на ожидание ответа от сервера, и вывод его в информационное окно на форме? public async...

38
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
28.10.2016, 09:57  [ТС]
Студворк — интернет-сервис помощи студентам
Дык я вот и думал,над вашим кодом и его. Мне главное,что бы работало каким способом не важно. Принципе у вас и у него всё очень похоже. Значит ,как я решил действовать.
Создал новую form по верх своей туда string grid зафигачил. Дальше я не понял как написать сюда в record еще один string grid
Delphi
1
2
3
4
5
6
7
8
type
  Rec = record
    stringgrid1Line:Integer;//вот так навреное
    sgLine: Integer;
    cData: String;
    sData: String;
    fCount: Integer;
end;
Ну а дальше я планировал с Message Box разобраться.
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
28.10.2016, 10:31
Kostya2345, еще раз. Давайте так.
1) Зачем вторая форма? В чем ее назначение?
2) Зачем СтрингГрид? В чем его назначение?
3) Что вы добавили в record и зачем?
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
28.10.2016, 10:39  [ТС]
1) Форма для отображения ответа
2) В string grid будет отображаться ответ
3) Я старался следовать инструкции,что мне написали.
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
28.10.2016, 10:43
1) Логично. Но не могли бы вы описать процесс отображения ответа. Например, "я нажму кнопку "Ответ" и ответ выведется вот в таком-то виде".
2) Логично. В каком виде?
3) Это не ответ. Вы уже попали в ситуацию, когда запутались, благодаря тому, что просто "следовали инструкции". Инструкция, в целом, безупречна, но она безупречна если вы ее понимаете. Если вам скажут "возьмите двухордовую шестерню ускорителя частиц и натрите ее спиртом", то не логичнее ли сначала выяснить, что такое "двухордовая шестерня ускорителя частиц", прежде чем пытаться натереть первое, что попало под понятное вам понятие шестерни?
1
82 / 82 / 39
Регистрация: 17.02.2016
Сообщений: 464
28.10.2016, 11:23
кидаем на форму StatusBar1, двойной клик по нем - добавляем нужные нам ячейки
вывод ответа
Delphi
1
StatusBar1.Panels[0{номер панели статусбара}].Text := ('тут ваш текст');
1
 Аватар для MyEternity
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
30.10.2016, 22:02
Цитата Сообщение от Kostya2345 Посмотреть сообщение
Ну а дальше я планировал с Message Box разобраться.
Рукалицо

Цитата Сообщение от HiredKiller Посмотреть сообщение
кидаем на форму StatusBar1, двойной клик по нем - добавляем нужные нам ячейки
вывод ответа
ТС это доконает окончательно. )

Kostya2345, вы можете сделать так, как вам угодно. Я лишь привел пример. Если вы его не поняли - то спросите что именно в "алгоритме, который вам посоветовал я", непонятно, а не извращайте его логику так, что сами уже не можете понять что делать дальше.
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
31.10.2016, 05:47  [ТС]
А ну хорошо вот разберём
1. Делаете отдельную форму. (Сделал все хорошо)
2. Делаете на ней SG.(Добавил String Grid на новую форму,все хорошо)
3. Добавляете в Record который обслуживает дубли - еще одно измерение (номера строк первого SG) в котором будут фиксироваться строки.(Вот строки Record туда надо добавить номер строки нового String Grid или старого ,как это сделать и где эти строки найти?)
Delphi
1
2
3
4
5
6
Rec = record
    StringGrid1:Integer;//так? или нет как это номер строки?
    sgLine: Integer;
    cData: String;
    sData: String;
    fCount: Integer;
4. Вместо MessageBox вставляете заполнение SG на второй форме.(так это получается мне нужно удалить старый MessageBox,а информацию оттуда перекинуть в новый String Grid?) И не надо извращаться с Max, оно зачем тут вообще? Простой вывод строки и Inc(SG.RowCount, 1);

Добавлено через 13 минут
В каком виде я хочу получить ответ:таблица String Grid и в ней колонки Значение Номер документа Дата Количество
3 58954 22.07.2016 2

Добавлено через 37 минут
Цитата Сообщение от HiredKiller Посмотреть сообщение
кидаем на форму StatusBar1, двойной клик по нем - добавляем нужные нам ячейки
вывод ответа
DelphiВыделить код
1
StatusBar1.Panels[0{номер панели статусбара}].Text := ('тут ваш текст');
Так ,а как добавить нужные нам ячейки и что здесь писать
Delphi
1
Text := ('тут ваш текст');
Я разместил вот здесь
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
begin
StatusBar1.Panels[0{номер понели статус бара}].Text := ('ваш текст');
  //Отфильтруем нужные значения по  по 3 и 7-й колонке одновременно.
  for x := 1 to sgExcel.RowCount-1 do FillData(sgExcel.Cells[3,x], sgExcel.Cells[7,x], x);
  //Покажем где у нас нужные значения.
  for x := Low(cache) to High(cache) do
    if cache[x].fCount > 1
      then MessageBox
        (
          Handle,
          pChar(Format('Значения: [%d],Номер документа %s: , количество: [%d]',
            [
              cache[x].sgLine,
              cache[x].cData + ' ' +  cache[x].sData,
              cache[x].fCount
            ])),
          pChar(fMain.Caption),
          MB_ICONINFORMATION or MB_OK
        );
end;
Добавлено через 14 минут
Цитата Сообщение от HiredKiller Посмотреть сообщение
кидаем на форму StatusBar1, двойной клик по нем - добавляем нужные нам ячейки
вывод ответа
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
StatusBar1.Panels[0{номер панели статусбара}].Text := ([DELPHI]('//Покажем где у нас нужные значения.
  for x := Low(cache) to High(cache) do
    if cache[x].fCount > 1
      then MessageBox
        (
          Handle,
          pChar(Format('Значения: [%d],Номер документа %s: , количество: [%d]',
            [
              cache[x].sgLine,
              cache[x].cData + ' ' +  cache[x].sData,
              cache[x].fCount
            ])),
          pChar(fMain.Caption),
          MB_ICONINFORMATION or MB_OK
        );');
);[/DELPHI]
Вот этот текст?
0
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
31.10.2016, 09:01  [ТС]
Цитата Сообщение от HiredKiller Посмотреть сообщение
кидаем на форму StatusBar1, двойной клик по нем - добавляем нужные нам ячейки
вывод ответа
DelphiВыделить код
1
StatusBar1.Panels[0{номер панели статусбара}].Text := ('тут ваш текст');
Так вроде разобрался. На скриншоте можно посмотреть,что я не так сделал. Вроде разобрался с ячейками сделал их сколько нужно. Но как заставить их выводить ответ из messagebox. Ниже будет скриншот подскажите,что я неправильно сделал?
Миниатюры
Вывод ответа на отдельную форму  
0
6004 / 4579 / 1096
Регистрация: 29.08.2013
Сообщений: 28,278
Записей в блоге: 3
31.10.2016, 09:50
Цитата Сообщение от Kostya2345 Посмотреть сообщение
что я неправильно сделал?
а что вы сделали?
взяли текст и скопировали его в делфи и все

а в комментариях же все написано.
0
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
31.10.2016, 10:11  [ТС]
Ну да,там же написано ваш текст. Что я седлал не так объясните пожалуйста.
0
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
31.10.2016, 10:47  [ТС]
Вот архив.
Вложения
Тип файла: 7z Новая папка.7z (196.6 Кб, 1 просмотров)
0
6004 / 4579 / 1096
Регистрация: 29.08.2013
Сообщений: 28,278
Записей в блоге: 3
31.10.2016, 11:28
Цитата Сообщение от Kostya2345 Посмотреть сообщение
Что я седлал не так объясните пожалуйста.
прочтите что написано в комментариях!!!!!!!!!!!!!!!
0
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
01.11.2016, 10:34  [ТС]
Ок ,можно ли увеличить шрифт текста?

Добавлено через 46 минут
Всё текст сам увеличил. В общем мой ответ отображается в List Box. Но всё как то слитно получается можно ли какие нибудь разгарничитили поставить.

Добавлено через 1 час 41 минуту
Ещё одна проблема. Значит вот код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
begin
  ListBox1.Clear;
  //Отфильтруем нужные значения по  по 3 и 7-й колонке одновременно.
  for x := 1 to sgExcel.RowCount - 1 do
    FillData(sgExcel.Cells[3, x], sgExcel.Cells[7, x], x);
  //Покажем где у нас нужные значения.
  for x := Low(cache) to High(cache) do
    if cache[x].fCount > 1 then
    ListBox1.Items.Add(Format('Номер строки: [%d],Номер документа %s:Дата , : Количество возобновлений[%d] ',
    [cache[x].sgLine,
    cache[x].cData + ' ' +
    cache[x].sData,
    cache[x].fCount]));
end;
 
end.
Проблема в том ,что номер документа и дата сливаются %s: вот этот символ отвечает сразу за вывод номера документа и даты. То есть [] их уже нельзя поставить,чтобы разграничить и подписать дату с левой стороны тоже нельзя. Можно ли это исправить?
0
6004 / 4579 / 1096
Регистрация: 29.08.2013
Сообщений: 28,278
Записей в блоге: 3
01.11.2016, 10:49
Цитата Сообщение от Kostya2345 Посмотреть сообщение
Можно ли это исправить?
все можно исправить - это же текст

напишите как вы хотите что бы было
0
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
02.11.2016, 09:49  [ТС]
Так,значит программа выводит ответ в виде: Номер строки:[415]. Номер документа 3737 10.04.2012:Дата.:Количество возобновлений[2]
А мне нужно вот так Номер строки:[415]. Номер документа 3737 Дата: 10.04.2012.:Количество возобновлений[2]
То есть дату вставить справа,это всё прописывается в коде
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  ListBox1.Clear;
  //Отфильтруем нужные значения по  по 3 и 7-й колонке одновременно.
  for x := 1 to sgExcel.RowCount - 1 do
    FillData(sgExcel.Cells[3, x], sgExcel.Cells[7, x], x);
  //Покажем где у нас нужные значения.
  for x := Low(cache) to High(cache) do
    if cache[x].fCount > 1 then
    ListBox1.Items.Add(Format('Номер строки: [%d],Номер документа %s:Дата , : Количество возобновлений[%d] ',
    [cache[x].sgLine,
    cache[x].cData + ' ' +
    cache[x].sData,
    cache[x].fCount]));
end;
 
end.
Если дату поставить между %s этим заноком то программа каршится
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
02.11.2016, 09:58
Вас вот это:
Delphi
1
cache[x].cData + ' ' +cache[x].sData
на какие мысли наводит?
0
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
02.11.2016, 10:13  [ТС]
Точно всё исправил спасибо. Кстати ,а возможно сделать так,чтобы программа вела поиск ещё и по словам. Сейчас она фильтрует по 3 и 7 столбцу одновременно там только цифры. А можно к этому ещё и 5 столбец в нём слова находятся,и программа скажем будет ещё и по словам фильтровать.
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
02.11.2016, 10:48
Kostya2345, да без проблем, вот честное слово. Можно, причем несложно. Но "можно" означает "сделайте мне" или означает, что вы заинтересованы сделать это самостоятельно и просто спрашиваете принципиальную возможность?
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 115
02.11.2016, 10:55  [ТС]
Да я спросил возможно ли это сделать(понял,что да) и как это сделать?.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2016, 10:55

Калькулятор: вывод ответа на форму html
Здравствуйте, помогите. Написал калькулятор в одном файле test.php, все работает норм , а мне надо, чтобы в html файле, была форма и...

Вывод ответа в форму (регулярные выражения)
Столкнулся с проблемкой, если выводить просто в консоль - он выводит как и надо - все совпадения. Но при выводе в форму TextArea он при...

Как вывести значения функции в отдельную форму?
Всем привет. Нужно вывести с помощью ViewGrid значения из функции с Xнач и Xкон, с шагом dx. Ну вот, создал две формы, на первой идёт...

Как вывести надписи из DataGrid в отдельную форму
Всем привет - есть вопрос. Создаю основную форму с DataGrid и кнопками. По кнопкам Редактировать, добавить - открывается отдельная форма....

Как создать отдельную форму для авторизации
ребята помогите на языке прогрмаммирования microsoft visual studio 2010 professional!буду благодарна...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru