Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2010, 07:34   #1
heny
Пользователь
 
Аватар для heny
 
Регистрация: 04.03.2010
Сообщений: 25
По умолчанию delphi избежать повторение кода из-за одного оператора

Здравствуйте, я Вам уже писала про эту программу, спасибо всем кто мне помог. Но написание курсового отложилось на определенное время и я снова хочу вернуться к нему
Программа написание текстового редактора на Delphi.
Вопрос в следующем:
Я написала код для пунктов "Сохранить", "Сохранить как" и "Создать". Все работает, но есть одно НО.
При сохранении в заголовке текстового редактора появляется имя файла, которое я сохраняю.
При написании пункта "Создать" я написала следующий код:

Код:
procedure TEditor.Create1Click(Sender: TObject);
begin

  if RichEdit1.Modified=true then
     begin
        if trim(RichEdit1.Lines.text)='' then
            begin RichEdit1.Clear;
            end
       else
           begin
 mes := Application.MessageBox ('Вы хотите сохранить документ?',  'Предупреждение', mb_YesNoCancel);
                   if mes = mrYes then
                       begin
                           if FName > '' then
                               begin
                                  Save1Click(Sender);
                                  RichEdit1.Clear;
                               end
                           else
                               begin
                                  SaveAs1Click(Sender);
                                  RichEdit1.Clear;
                               end

                      end;
           end;
end;
то есть вставила в код процедуры пунктов "Сохранить" и "Сохранить как". Все работает, но появляется проблема: в этих процедурах переменной FName присвается имя сохраненного файла, и при работе пункта "Создать", когда нажимаешь "сохранить файл: да", программа сохраняет, затем очищает, но остается имя файла в заголовке редактора. Не знаю как это исправить, у меня только одно предположение, чтобы вместо
Код:
if FName > '' then
                               begin
                                  Save1Click(Sender);
                                  RichEdit1.Clear;
                               end
                           else
                               begin
                                  SaveAs1Click(Sender);
                                  RichEdit1.Clear;
                               end
расписывать процедуры Save1Click и SaveAs1Click, и там менять строку с присвоением переменной FName имени файла (присвоить ей пустое значение).
Но хочется не усложнять код, а как сделать по другому сама не могу додуматься, помогите студентке

А вот код процедуры SaveAs1Click (в Save1Click идет повторение):
Код:
procedure TEditor.SaveAs1Click(Sender: TObject);
begin
   if trim(RichEdit1.Lines.text)='' then
   StatusBar1.Panels[1].Text:='Количество строк в тексте 0'
   else
     begin
        if SaveDialog1.Execute then
        begin
           RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
           RichEdit1.Modified:=false;
           StatusBar1.Panels[0].Text:='';
           FName:=SaveDialog1.FileName;
           Editor.Caption:='Текстовый редактор - '+FName;
           StatusBar1.Panels[1].Text:='Текст сохранен';
        end;
   end;
end;
heny вне форума Ответить с цитированием
Старый 30.09.2010, 09:48   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

А почему бы точно так же не прописать новый заголовок в функции создания нового документа?
Код:
procedure TEditor.Create1Click(Sender: TObject);
begin

  if RichEdit1.Modified=true then
    ...
  else
    ...
  Editor.Caption:='Текстовый редактор - Новый документ';
end;
Пара советов. Не пишите, пожалуйста,
Код:
if RichEdit1.Modified=true then
,
пишите
Код:
if RichEdit1.Modified then

И вот эта проверка
Код:
 if trim(RichEdit1.Lines.text)='' then
            begin RichEdit1.Clear; end
не логична. Я почищу документ, а программа мне это не сохранит.
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 30.09.2010, 10:10   #3
heny
Пользователь
 
Аватар для heny
 
Регистрация: 04.03.2010
Сообщений: 25
По умолчанию


спасибо, попытаюсь сделать)))

Последний раз редактировалось heny; 30.09.2010 в 10:18.
heny вне форума Ответить с цитированием
Старый 05.10.2010, 11:48   #4
heny
Пользователь
 
Аватар для heny
 
Регистрация: 04.03.2010
Сообщений: 25
По умолчанию

Цитата:
И вот эта проверка
Код:


if trim(RichEdit1.Lines.text)='' then
begin RichEdit1.Clear; end

не логична. Я почищу документ, а программа мне это не сохранит.
а не могли бы Вы еще мне подсказать. Вот я понимаю, что если я почищу документ, то при нажатии на "Создать" должно быть предупреждение: Документ был изменен. Сохранить изменения?
Вот я понимаю как сделать сохранить
Код:
RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
а как сделать, если отвечают нет. До этого я просто очищала экран и меняла Editor.Caption, но как выяснилось, то что я потом творю в как будто бы новом документе на самом деле происходит в том, который я якобы закрыла . Понимаю, что должна быть какая та функция, которая сбросит тот документ и начнет новый, но че-т не могу допетрить как это сделать

Последний раз редактировалось heny; 05.10.2010 в 11:50.
heny вне форума Ответить с цитированием
Старый 05.10.2010, 20:55   #5
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

У Вас же есть переменная FName, которая хранит имя текущего файла. Чистите её, когда создаёте новый документ, и если больше нигде багов нет, то всё должно быть ок. А вообще лучше покажите код с процедурами Save и SaveAs, а то уже непонятно что там происходит
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 06.10.2010, 06:08   #6
heny
Пользователь
 
Аватар для heny
 
Регистрация: 04.03.2010
Сообщений: 25
По умолчанию

Точно! Все гениальное просто. Иногда долго думаешь над чем-то долго придолго и мозг отказывается понимать простые вещи, хотя ведь до этого я так делала уже

Процедура save:
Код:
procedure TEditor.Save1Click(Sender: TObject);
begin
  if FName='' then
      begin
        if SaveDialog1.Execute then
          begin
            RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
            RichEdit1.Modified:=false;
            StatusBar1.Panels[0].Text:='';
            FName:=SaveDialog1.FileName;
            Editor.Caption:='Текстовый редактор - '+FName;
            StatusBar1.Panels[1].Text:='Текст сохранен';
          end;
      end
  else
      begin
        RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
        StatusBar1.Panels[0].Text:='';
        StatusBar1.Panels[1].Text:='Текст сохранен';
    end;
end;
Процедура Save As:
Код:
procedure TEditor.SaveAs1Click(Sender: TObject);
     begin
        if SaveDialog1.Execute then
        begin
           RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
           RichEdit1.Modified:=false;
           StatusBar1.Panels[0].Text:='';
           FName:=SaveDialog1.FileName;
           Editor.Caption:='Текстовый редактор - '+FName;
           StatusBar1.Panels[1].Text:='Текст сохранен';
        end;
   end;
А код "Создать" на данный момент выглядит так:
Код:
procedure TEditor.Create1Click(Sender: TObject);
begin
   if RichEdit1.Modified then
      begin
         if FName > '' then
          begin
             mes := Application.MessageBox ('Документ был изменен. Вы хотите сохранить изменения в документе?',  'Предупреждение', mb_YesNoCancel);
             if mes = mrYes then
             begin
               Save1Click(Sender);
               RichEdit1.Clear;
               Editor.Caption:='Текстовый редактор - Новый документ';
               FName:='';
             end;
             if mes = mrNo then
             begin
               FName:='';
               Editor.Caption:='Текстовый редактор - Новый документ'
             end;
         end
         else
             mes := Application.MessageBox ('Вы хотите сохранить документ?',  'Предупреждение', mb_YesNoCancel);
             if mes = mrYes then
                 begin
                   Save1Click(Sender);
                   RichEdit1.Clear;
                   FName:='';
                   Editor.Caption:='Текстовый редактор - Новый документ';
                 end;
             if mes = mrNo then
                 begin
                    RichEdit1.Clear;
                    FName:='';
                    Editor.Caption:='Текстовый редактор - Новый документ';
                 end;
             end
   else
     begin
       RichEdit1.Clear;
       FName:='';
       Editor.Caption:='Текстовый редактор - Новый документ';
     end;
end;
и все равно создать какой-то косячный
Если делаешь изменения в уже сохраненном документа (FName > ''), то он открывает окно Execute, хотя должен просто сохранять. Я так понимаю, что проблема вот в этом фрагменте, но я как всегда не могу понять в чем, на мой взгляд все должно работать:
Код:
if mes = mrYes then
             begin
               Save1Click(Sender);
               RichEdit1.Clear;
               Editor.Caption:='Текстовый редактор - Новый документ';
               FName:='';
             end;
И еще, понимаю, что совсем завалила вопросами, но не могу ничего с собой поделать, учусь то на заочном, обратиться не к кому
Речь идет о пункте "Открыть". Я прекрасно понимаю, что он должен быть подобен компоненту SaveDialog. Пишу следующий код:
Код:
procedure TEditor.Open1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
   begin
     RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
     FName:=OpenDialog1.FileName;
     RichEdit1.Modified:=false;
     StatusBar1.Panels[0].Text:='';
     Editor.Caption:='Текстовый редактор - '+FName;
   end;
end;
Воооооот, но если я меняю открытый документ, то все заканчивается авраийно, методом проб и ошибок, я поняла, что ошибка в этой строке:
FName:=OpenDialog1.FileName;
но если ее убрать, то в заголовке окна не видно, имя открытого документа
вся я измаялась

Последний раз редактировалось heny; 06.10.2010 в 09:52.
heny вне форума Ответить с цитированием
Старый 07.10.2010, 03:33   #7
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Для начала в Save1Click здесь
Код:
 else
      begin
        RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
        StatusBar1.Panels[0].Text:='';
        StatusBar1.Panels[1].Text:='Текст сохранен';
    end;
добавьте RichEdit1.Modified := false;Кстати, раз уж у Вас имя файла хранится в FName, то зачем лезть в SaveDialog1.FileName при его сохранении? Не факт что там вообще имя занесено
Если будет глючить дальше, сделайте трассировку. Выделяете эту строчку
Код:
   if RichEdit1.Modified then
нажимаете F5, потом F9, делаете все действия, после которых идут глюки. Когда вылезет окно редактора со стрелкой на эту строку, нажимайте F8 для следующего шага. Так Вы поймёте, по каким if'ам идёт прога и будет легче отловить ошибку, чем методом проб и ошибок. Если не получится, прикрепите сюда весь проект, посмотрю, а то щас уже у самого глаза крестиком
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 07.10.2010, 10:56   #8
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

когда-то давным давно писал текстовый редактор на VB .Net (эх, были времена...), вот часть исходников

Код:
Private Sub СоздатьToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles СоздатьToolStripMenuItem.Click, ToolStripButton1.Click
        If RichTextBox1.Modified Then
            Select Case MsgBox("Будет выполнена очистка текстового поля без сохранения всех изменений. Продолжить?", CType(MsgBoxStyle.YesNo + MsgBoxStyle.Question, MsgBoxStyle))
                Case MsgBoxResult.Yes
1:                  RichTextBox1.Clear()
                    path = ""
            End Select
        Else
            GoTo 1
        End If
        Me.Text = fullPath(path)
    End Sub

    Sub saveAs()
        SaveFileDialog1.FileName = System.IO.Path.GetFileNameWithoutExtension(path)
        If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Try
                If SaveFileDialog1.FilterIndex = 1 Then
                    RichTextBox1.SaveFile(SaveFileDialog1.FileName, RichTextBoxStreamType.PlainText)
                    RichTextBox1.Modified = False
                    path = SaveFileDialog1.FileName
                ElseIf SaveFileDialog1.FilterIndex = 2 Then
                    RichTextBox1.SaveFile(SaveFileDialog1.FileName, RichTextBoxStreamType.UnicodePlainText)
                    RichTextBox1.Modified = False
                    path = SaveFileDialog1.FileName
                ElseIf SaveFileDialog1.FilterIndex = 3 Then
                    Call save(SaveFileDialog1.FileName, System.Text.Encoding.BigEndianUnicode)
                ElseIf SaveFileDialog1.FilterIndex = 4 Then
                    Call save(SaveFileDialog1.FileName, System.Text.Encoding.UTF7)
                ElseIf SaveFileDialog1.FilterIndex = 5 Then
                    Call save(SaveFileDialog1.FileName, System.Text.Encoding.UTF8)
                ElseIf SaveFileDialog1.FilterIndex = 6 Then
                    Call save(SaveFileDialog1.FileName, System.Text.Encoding.UTF32)
                End If
            Catch ex As Exception
                MsgBox("Не могу сохранить! Файл только для чтения и/или заблокирован другим процессом.", MsgBoxStyle.Exclamation)
            End Try
        End If
    End Sub


    Function fullPath(ByVal fileName As String) As String
        If fileName <> "" Then
            If cap = 1 Then
                Return "[ " & fileName & " ] - RDRsan"
            ElseIf cap = 0 Then
                Return "[ " & System.IO.Path.GetFileName(fileName) & " ] - RDRsan"
            End If
        Else
            Return "RDRsan"
        End If
    End Function

    Sub save(ByVal fileName As String, ByVal Encod As System.Text.Encoding)
        Try
            writer = New System.IO.StreamWriter(fileName, False, Encod)
            writer.Write(RichTextBox1.Text)
            writer.Dispose()
            RichTextBox1.Modified = False
            path = fileName
        Catch ex As Exception
            MsgBox("Не могу сохранить! Файл только для чтения и/или заблокирован другим процессом.", MsgBoxStyle.Exclamation)
        End Try
    End Sub
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 08.10.2010, 06:58   #9
heny
Пользователь
 
Аватар для heny
 
Регистрация: 04.03.2010
Сообщений: 25
По умолчанию

а чем можно заменить RichEdit1.Lines.SaveToFile(SaveDial og1.FileName);, похоже в этом и проблема

Последний раз редактировалось heny; 08.10.2010 в 09:12.
heny вне форума Ответить с цитированием
Старый 10.10.2010, 02:32   #10
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Заменить это особо нечем. Кстати, насколько я помню, может получиться так, что имя файла будет без расширения, тогда надо дополнительно приписывать его в зависимости от SaveDialog1.FilterIndex
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повторение CraftR14 Общие вопросы Delphi 8 17.04.2010 20:15
Как избежать повторение одного и того же номера дважды CockPuncher Microsoft Office Excel 6 03.09.2009 09:53
использование условного оператора в теле оператора цикла с условием машко Помощь студентам 2 21.06.2009 23:55
delphi синтаксический контроль заданного оператора lusuj Помощь студентам 1 10.12.2008 22:42