Форум программистов
Правила форума  |  Исходники Delphi  |  Основы Delphi  |  Блог программистов  |  Рассылка  |  Закажи футболку!  |  Конкурс программистов призы на 2000 руб


Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi

Ответ
 
Опции темы
Старый 25.11.2006, 13:39   #1
GN_
Форумчанин
 
Аватар для GN_
 
Регистрация: 25.11.2006
Адрес: Казахстан
Сообщений: 102
Репутация: 71
Вопрос вопрос по процедуре

Есть такой вопрос. Сейчас пишу прогу (блокнот), прошу профессионалов не смеятся, многие наверно с этого начинали, так вот код:


Код:

unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, Menus; 
 
type 
  TForm1 = class(TForm) 
    Memo1: TMemo; 
    Button2: TButton; 
    Edit1: TEdit; 
    MainMenu1: TMainMenu; 
    J1: TMenuItem; 
    N1: TMenuItem; 
    procedure Button2Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure J1Click(Sender: TObject); 
    procedure N1Click(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.dfm} 
 
 
// Кнопка "Сохранить" 
procedure TForm1.Button2Click(Sender: TObject); 
var 
my_file: TextFile; // Файл в который будут записаны данные 
fname: String[90]; // Путь к фалу 
i: word; 
 
begin 
 
  fname := Edit1.Text; 
  {$i-}  // Запрещаем компилятору проверять ошибки. 
  AssignFile(my_file, fname); 
  Rewrite(my_file); // Открыть файл для перезаписи 
  {$i+} 
 
  for i := 0 to Memo1.Lines.Count do 
    writeln(my_file, Memo1.Lines[i]); 
  CloseFile(my_file); 
 
end; 
 
 
 
// При открытии программы... 
procedure TForm1.FormCreate(Sender: TObject); 
var 
my_file: TextFile; // Файл в который будут записаны данные 
fname: string[50]; // Путь к фалу 
bufer: string;     // Буфер для чтения из файла 
 
begin 
 
  fname := Edit1.Text; 
  // Запрещаем компилятору проверять ошибки. 
  AssignFile(my_file, fname); 
  {$i-} 
  Reset(my_file); // Открыть файл для чтения 
  {$i+} 
 
  if IOResult = 0 then  // Если при открытии файла ошибок нет, то... 
  begin 
    while not EOF(my_file) do 
    begin 
      readln(my_file, bufer); 
      Memo1.Lines.Add(bufer); // Добавить очередную строку в поле Memo1 
    end; 
    CloseFile(my_file); 
  end 
  else   // Если файл не существует 
  begin 
    showmessage('Файл ' + fname + ' не существует!' + #13 + 
                'прим. При сохранении текста эта ошибка выводиться не будет'); 
    exit; 
  end; 
 
 
end; 
 
 
// Меню: О программе... 
procedure TForm1.J1Click(Sender: TObject); 
begin 
 
  showmessage('Автор программы - ***' + #13 + 'Дата создания: *** года'); 
 
end; 
 
 
// Меню: Закрыть 
procedure TForm1.N1Click(Sender: TObject); 
begin 
 
  Close; 
 
end; 
 
end.


Я хочу её немного усовершенствовать, а именно создать такую фигню: когда чел закрывает прогу ( TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean) ), то прога проверяет был ли изменён текст (событие TForm1.Memo1Change). И если текст был изменён, то прога выдаёт сообщение сохранить или нет, если нет, то прога закрывается, а если да, то надо сохранить и закрыть. Как это сделать? У меня есть тока догатки, можно создать свою процедуру (или функцию) сохранения текста и при нажатии кнопки её вызывать и когда при выходе чел нажимает «ДА» (т.е. хочет сохранить текст). Написать свою процедуру никак не получается, помогите.
GN_ вне форума   Ответить с цитированием
Старый 25.11.2006, 14:04   #2
zetrix
Delphi/C++/C#
Профессионал
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 2,116
Репутация: 601
По умолчанию

в TForm1.FormCloseQuery пишешь такую строчку:
if Application.MessageBox('SAVE?','LOO k at ME!',36)=mrYes then
{Сюда пишешь код сохранения (или просто процедуру сохранения)};
zetrix вне форума   Ответить с цитированием
Старый 25.11.2006, 16:59   #3
GN_
Форумчанин
 
Аватар для GN_
 
Регистрация: 25.11.2006
Адрес: Казахстан
Сообщений: 102
Репутация: 71
По умолчанию

zetrix спасибо. Как ты предложил, всё работает. Только приходится 2 раза дублировать один и тот же код. Он у меня дублируется в
// При закрытии программы
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
и в
// Кнопка "Сохранить"
procedure TForm1.Button2Click(Sender: TObject);


А когда я пытаюсь создать свою процедуру:

procedure kol;
var
my_file: TextFile; // Файл в который будут записаны данные
fname: String[90]; // Путь к фалу
i: word;

begin

fname := Edit1.Text;
{$i-} // Запрещаем компилятору проверять ошибки.
AssignFile(my_file, fname);
Rewrite(my_file); // Открыть файл для перезаписи
{$i+}

for i := 0 to Memo1.Lines.Count do
writeln(my_file, Memo1.Lines[i]);
CloseFile(my_file);

end;


То выдаётся такая ошибка:
[Error] Unit1.pas(51): Undeclared identifier: 'Edit1'
Вот 51 строка fname := Edit1.Text;

Короче получается так, когда создаёшь свою процедуру, то почему-то обычные объекты становятся недоступными типа Edit, Memoи тд., почему?

И ещё вопрос: почему в Делфи такие маленькие программы таких больших размеров (около 300-400 Кб)?
GN_ вне форума   Ответить с цитированием
Старый 25.11.2006, 19:20   #4
zetrix
Delphi/C++/C#
Профессионал
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 2,116
Репутация: 601
По умолчанию

Цитата:
То выдаётся такая ошибка:
[Error] Unit1.pas(51): Undeclared identifier: 'Edit1'
Вот 51 строка fname := Edit1.Text;
В разделе privite (вроде так пишется - смотри наверху кода, где форма описывается), там напиши название своей процедуры, а потом (когда описываешь свою процедуру):
Цитата:
А когда я пытаюсь создать свою процедуру:
procedure kol;
var
...
Пиши так:
procedure Tform1.kol;
var
...

Тогда всё будет доступно.

Цитата:
почему в Делфи такие маленькие программы таких больших размеров (около 300-400 Кб)?
А это вот особенность такая

Последний раз редактировалось zetrix; 25.11.2006 в 19:23.
zetrix вне форума   Ответить с цитированием
Старый 26.11.2006, 00:59   #5
mihali4
Старый брюзга
Заслуженный модератор
 
Аватар для mihali4
 
Регистрация: 22.11.2006
Адрес: Москва, Коньково
Сообщений: 8,851
Репутация: 2392
По умолчанию

Цитата:
почему в делфи такие маленькие программы таких больших размеров (около 300-400 кб)?
ну, это устраняется, и не сказать, чтобы как-то трудно...
по-моему, здесь это тоже описывалось.
посмотри в разделе про апи.
не найдешь (или не поймешь) - открывай тему, поможем...
но, вроде, там была темка с похожим названием (а может, я и путаю - форумов много, а я - один).
__________________
Когда я вижу "памагити" в названии темы - я хватаюсь за пистолет...

Последний раз редактировалось mihali4; 26.11.2006 в 01:05.
mihali4 вне форума   Ответить с цитированием
Старый 26.11.2006, 13:09   #6
GN_
Форумчанин
 
Аватар для GN_
 
Регистрация: 25.11.2006
Адрес: Казахстан
Сообщений: 102
Репутация: 71
По умолчанию

zetrix большое спасибо за помощь, ты меня очень выручил.
mihali4 не нашёл такую тему.
GN_ вне форума   Ответить с цитированием
Старый 26.11.2006, 13:45   #7
zetrix
Delphi/C++/C#
Профессионал
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 2,116
Репутация: 601
По умолчанию

пустяки... дело-то житейское
zetrix вне форума   Ответить с цитированием
Старый 26.11.2006, 15:21   #8
mihali4
Старый брюзга
Заслуженный модератор
 
Аватар для mihali4
 
Регистрация: 22.11.2006
Адрес: Москва, Коньково
Сообщений: 8,851
Репутация: 2392
По умолчанию

Цитата:
Сообщение от GN_ Посмотреть сообщение
mihali4 не нашёл такую тему.
Как это?
А я почему-то нашел...
Вот:
http://www.programmersforum.ru/showthread.php?t=81
__________________
Когда я вижу "памагити" в названии темы - я хватаюсь за пистолет...
mihali4 вне форума   Ответить с цитированием
Старый 26.11.2006, 16:13   #9
GN_
Форумчанин
 
Аватар для GN_
 
Регистрация: 25.11.2006
Адрес: Казахстан
Сообщений: 102
Репутация: 71
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Как это?
А я почему-то нашел...
Вот:
http://www.programmersforum.ru/showthread.php?t=81
Понятно, я то искал в разделе Апи как ты сказал, а через поиск не нашёл. Спасибо что дал ссылку.
Этот форум вообще классный, жаль я тока недавно о нём узнал. Большое спасибо автору сайта за создание этого форума.
GN_ вне форума   Ответить с цитированием
Старый 26.11.2006, 16:40   #10
GN_
Форумчанин
 
Аватар для GN_
 
Регистрация: 25.11.2006
Адрес: Казахстан
Сообщений: 102
Репутация: 71
По умолчанию

Вы не представляете моей радости, когда всё-таки получилось сократить вес программы. Был вот такой список:
vcl;rtl;vclx;indy;inet;xmlrtl;vclie ;inetdbbde;inetdbxpress;dbrtl;dsnap ;dsnapcon;vcldb;soaprtl;VclSmp;dbex press;dbxcds;inetdb;bdertl;vcldbx;w ebdsnap;websnap;adortl;ibxpress;tee ui;teedb;tee;dss;visualclx;visualdb clx;vclactnband;vclshlctrls;Intrawe bDB_50_70;Intraweb_50_70;Rave50CLX; Rave50VCL;dclOfficeXP

Я из него убрал только indy и программа стала весить не 400 а 20 кб. Двадцатикратное уменьшение – круто. Токо вот интересно для чего этот indy нужен?
GN_ вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переход к другой процедуре Detka Общие вопросы Delphi 7 13.07.2008 16:50
Вопрос по процедуре VenMaster Общие вопросы Delphi 5 13.06.2008 17:37
вопрос по процедуре GotoXY и TextAttr и Mister Been Паскаль 8 03.06.2008 10:52
как в процедуре объявить массив? kolduev Помощь студентам 7 18.02.2008 23:35
Ошибка в процедуре GAGARIN-NEW Помощь студентам 2 21.12.2007 09:23


Все интернет-магазины Москвы на Викимарте: компьютеры и софт, художественные книги и профессиональная литература, наручные часы.



04:10.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.

Ask Doctor at Healpth.com