Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 584

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Я сделал задачу, но делал я её в консольном, а надо в оконном. Как сделать, чтобы было правильно?
Код ниже:

Приложение:
  1. program Records;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. type
  9. Cathedra = record
  10. Name : String;
  11. Number : Integer;
  12. Head : record
  13. FIO : String;
  14. Phone : String;
  15. end;
  16. CathedraPhone : String;
  17. Staff : Integer;
  18. end;
  19.  
  20. var
  21. DB : Array[0 .. 2] of Cathedra=(
  22. (Name:'Cathedra 1';Number:1;Head:(FIO:'Kosmachev M.I.';Phone:'111-222-333');CathedraPhone:'222-333-444';Staff:10),
  23. (Name:'Cathedra 2';Number:2;Head:(FIO:'Kazakov N.P.';Phone:'111-333-111');CathedraPhone:'442-777-444';Staff:30),
  24. (Name:'Cathedra 3';Number:3;Head:(FIO:'Prosyannikov M.S.';Phone:'222-232-333');CathedraPhone:'333-323-444';Staff:20));
  25.  
  26. procedure SearchAndPrint(DB : Array of Cathedra; N : Integer; Number : Integer);
  27. var
  28. I : Integer;
  29. begin
  30.  
  31. for I := 0 to N - 1 do
  32. if DB[I].Number = Number then
  33. begin
  34. WriteLn(' found:');
  35. WriteLn(' Name: ', DB[I].Name);
  36. WriteLn(' Number: ', DB[I].Number);
  37. WriteLn(' Head: ', DB[I].Head.FIO, ', ', DB[I].Head.Phone);
  38. WriteLn(' Phone: ', DB[I].CathedraPhone);
  39. WriteLn(' Staff: ', DB[I].Staff);
  40. Exit;
  41. end;
  42. WriteLn(' not found.');
  43. end;
  44.  
  45. var
  46. Number : Integer;
  47.  
  48. begin
  49. Write('Enter cathedra number to search: ');
  50. ReadLn(Number);
  51. SearchAndPrint(DB, 3, Number);
  52. WriteLn('Press ENTER to exit...');
  53. ReadLn;
  54. end.


ljtop Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: ljtop (статус: Посетитель)
Вопрос отправлен: 25 декабря 2009, 21:37
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, ljtop!
Как вариант: можно воспользоваться компонентом Edit для ввода информации (вместо Readln) и Memo для вывода (вместо Writeln).
Введённое в Edit число надо преобразовать из текста в число. Это делается с помощью функции StrToInt.
Перед записью хорошо бы очистить Memo методом Clear - Memo1.Lines.Clear. Для записи в Memo используется метод Add - Memo1.Lines.Add('добавляемая строчка'). Если нужно вывести в Memo число, то последнее нужно преобразовать в строку - IntToStr(Number).

В общем, последовательность действий:

1) Запускаете дельфи - у вас автоматически будет создан проект с оконным интерфейсом.
2) Ставите на форму текстовое поле (Edit). В свойство Text компонента Edit прописываете, например, единичку.
3) Перед Edit ставите метку (Label), в свойство Caption прописываете "Введите номер кафедры"
4) Справа от Edit ставите кнопку (Button), в свойство Caption прописываете "Поиск"
6) Ниже ставите компонент Memo.
Расположение компонентов может быть и иным - на ваш вкус.
7) Делаете двойной щелчок по кнопке - попадаете в редактор кода, в обработчик нажатия на кнопку. Там прописываете следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
 Number : integer;
begin
  Number := StrToInt(Edit1.Text);  // тут мы берём из Edit текст и преобразуем в число
  SearchAndPrint(DB, 3, Number);   // вызываем функцию поиска
end;

8) Затем добавляете процедуру SearchAndPrint - для этого поднимаетесь по коду выше, в раздел public. Там прописываете:
  public
    procedure SearchAndPrint(DB: array of Cathedra; N, Number: Integer);
Затем ниже, в разделе implementation прописываете код самой процедуры:
implementation
 
{$R *.dfm}
 
procedure TForm1.SearchAndPrint(DB: array of Cathedra; N, Number: Integer);
var
  I : Integer;
begin
  Memo1.Lines.Clear;
  for I := 0 to N - 1 do
    if DB[I].Number = Number then
      begin
        Memo1.Lines.Add(' found:');
        Memo1.Lines.Add('  Name: ' + DB[I].Name);
        Memo1.Lines.Add('  Number: ' + IntToStr(DB[I].Number));
        Memo1.Lines.Add('  Head: ' + DB[I].Head.FIO + ', ' + DB[I].Head.Phone);
        Memo1.Lines.Add('  Phone: ' + DB[I].CathedraPhone);
        Memo1.Lines.Add('  Staff: ' + IntToStr(DB[I].Staff));
        Exit;
      end;
  Memo1.Lines.Add(' not found.');
end;

9) В разделе объявлений типов type прописываете тип Cathedra:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  Cathedra = record
    Name : String;
    Number : Integer;
    Head : record
      FIO : String;
      Phone : String;
    end;
    CathedraPhone : String;
    Staff : Integer;
  end;
 
  TForm1 = class(TForm)...

10) Прописываете глобальную переменную DB, в которой и хранится информация по кафедрам. Использование глобальных переменных, это не есть гуд, конечно, но в нашем случае вопрос стоит в другом.
Код для глобальной переменной вставляете перед процедурой поиска:
implementation
 
{$R *.dfm}
var
  DB : Array[0 .. 2] of Cathedra=(
    (Name:'Cathedra 1';Number:1;Head:(FIO:'Kosmachev M.I.';Phone:'111-222-333');CathedraPhone:'222-333-444';Staff:10),
    (Name:'Cathedra 2';Number:2;Head:(FIO:'Kazakov N.P.';Phone:'111-333-111');CathedraPhone:'442-777-444';Staff:30),
    (Name:'Cathedra 3';Number:3;Head:(FIO:'Prosyannikov
M.S.';Phone:'222-232-333');CathedraPhone:'333-323-444';Staff:20));
 
procedure TForm1.SearchAndPrint(DB: array of Cathedra; N, Number: Integer);
var
...

Полный код приведён ниже.

P.S. Можете поступить проще - после установки всех компонентов на форму просто сделайте двойной щелчок по кнопке, а затем удалите весь имеющийся код и вставьте мой.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. Cathedra = record
  11. Name : String;
  12. Number : Integer;
  13. Head : record
  14. FIO : String;
  15. Phone : String;
  16. end;
  17. CathedraPhone : String;
  18. Staff : Integer;
  19. end;
  20.  
  21. TForm1 = class(TForm)
  22. Edit1: TEdit;
  23. Label1: TLabel;
  24. Memo1: TMemo;
  25. Button1: TButton;
  26. procedure Button1Click(Sender: TObject);
  27. private
  28. { Private declarations }
  29. public
  30. procedure SearchAndPrint(DB: array of Cathedra; N, Number: Integer);
  31. published
  32. { Public declarations }
  33. end;
  34.  
  35. var
  36. Form1: TForm1;
  37.  
  38. implementation
  39.  
  40. {$R *.dfm}
  41. var
  42. DB : Array[0 .. 2] of Cathedra=(
  43. (Name:'Cathedra 1';Number:1;Head:(FIO:'Kosmachev M.I.';Phone:'111-222-333');CathedraPhone:'222-333-444';Staff:10),
  44. (Name:'Cathedra 2';Number:2;Head:(FIO:'Kazakov N.P.';Phone:'111-333-111');CathedraPhone:'442-777-444';Staff:30),
  45. (Name:'Cathedra 3';Number:3;Head:(FIO:'Prosyannikov M.S.';Phone:'222-232-333');CathedraPhone:'333-323-444';Staff:20));
  46.  
  47. procedure TForm1.SearchAndPrint(DB: array of Cathedra; N, Number: Integer);
  48. var
  49. I : Integer;
  50. begin
  51. Memo1.Lines.Clear;
  52. for I := 0 to N - 1 do
  53. if DB[I].Number = Number then
  54. begin
  55. Memo1.Lines.Add(' found:');
  56. Memo1.Lines.Add(' Name: ' + DB[I].Name);
  57. Memo1.Lines.Add(' Number: ' + IntToStr(DB[I].Number));
  58. Memo1.Lines.Add(' Head: ' + DB[I].Head.FIO + ', ' + DB[I].Head.Phone);
  59. Memo1.Lines.Add(' Phone: ' + DB[I].CathedraPhone);
  60. Memo1.Lines.Add(' Staff: ' + IntToStr(DB[I].Staff));
  61. Exit;
  62. end;
  63. Memo1.Lines.Add(' not found.');
  64. end;
  65.  
  66. procedure TForm1.Button1Click(Sender: TObject);
  67. var
  68. Number : integer;
  69. begin
  70. Number := StrToInt(Edit1.Text);
  71. SearchAndPrint(DB, 3, Number);
  72. end;
  73.  
  74. end.


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 26 декабря 2009, 15:30
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 28 декабря 2009, 09:31; участников в обсуждении: 4.
Егор

Егор (статус: 10-ый класс), 25 декабря 2009, 23:57 [#1]:

"как правильно" - неправильный вопрос :) уж прошу прощения за каламбур
задачу можно решить миллионом способов
оконный интерфейс - он оконный. нужно просто понять, как должна выглядеть программа - какие текстовые поля, флажки, переключатели, кнопки и т.п. должны быть.
ну а потом уже "навешивать" на эти элементы заданные функции
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
ljtop

ljtop (статус: Посетитель), 26 декабря 2009, 00:19 [#2]:

для меня главное - вывод этой части:
var
Number : Integer;

begin
Write('Enter cathedra number to search: ');
ReadLn(Number);
SearchAndPrint(DB, 3, Number);
WriteLn('Press ENTER to exit...');
ReadLn;
end.

как это сделать для оконного? Звучит, как: "написать процедуру поиска/распечатки записи по номеру кафедры.
Жикльор

Жикльор (статус: 5-ый класс), 26 декабря 2009, 22:45 [#3]:

Ну Егор ты закачал!!! 8-))) Такой поэзии я еще со времен Ленина не видел! Держи +! 8-))
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
ljtop

ljtop (статус: Посетитель), 26 декабря 2009, 23:47 [#4]:

всё с вами ясно )
поглумиться любой может, а вот без сарказма ответить на вопрос... эх вы.
Жикльор

Жикльор (статус: 5-ый класс), 27 декабря 2009, 00:49 [#5]:

Цитата (ljtop):

всё с вами ясно )
поглумиться любой может, а вот без сарказма ответить на вопрос... эх вы.

А ты за что поставил мне -???!!!! За то что я похвалил ответ?? Ну и народ пошел!!! Убивал бы таких!!!!
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
ljtop

ljtop (статус: Посетитель), 27 декабря 2009, 01:11 [#6]:

за оффтоп) хвалить можно в другой теме. А тут бы я хотел что-то услышать конкретно по вопросу. Убивай. Адрес могу подсказать. С удовольствием встречу.
webkent

webkent (статус: 2-ой класс), 28 декабря 2009, 09:31 [#7]:

Признался бы что не правильно понял первый пост Жикльора

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 15:45
Выполнено за 0.04 сек.