Начинаю обсуждение программы для писателей.
https://disk.yandex.co.il/d/be9g8MsO1fkTCA
Редактор ТКФ для писателей
Сообщений 1 страница 9 из 9
Поделиться12018-01-10 23:01:47
Поделиться22018-01-10 23:20:43
TKF- Творец Крупных Форм .
Программа для написания повестей и романов.
Программа абсолютно бесплатная !!!
программа выполнена в минималистическом стиле,
чтобы не отвлекать внимание автора от работы над
произведением.
Как пользоваться программой:
Программа представляет из себя простой редактор с тремя
вкладками.
На главной вкладке нужно писать основной текст.
На вкладке структура нужно описывать сюжетные линии.
На вкладке персонажей надо описывать персонажей,
например их краткую характеристику, в какой главе
появляются впервые и т.д.
Главная вкладка сохраняется с расширением .txt !!!
На каждой вкладке можно независимо установить фонт и цвет.
Сервис работает только с главной вкладкой.
В разделе справки будут находиться таблицы со
знаками препинания.
Перед выходом из программы не забывайте сохранять проект!!!
P.S.
Над улучшением программы идёт постоянная работа.
Очень важны ваши отклики.
Поделиться32018-01-10 23:30:45
Весь код приводить нет смысла.
Вот процедура подсчёта слов :
procedure TForm2.N12Click(Sender: TObject); var str :TStringList; s :string; begin s:=Memo1.Text; str := TStringList.create; s:=StringReplace(s,'.',' ',[rfReplaceAll]); // заменяем разделители на пробелы s:=StringReplace(s,',',' ',[rfReplaceAll]); s:=StringReplace(s,'!',' ',[rfReplaceAll]); s:=StringReplace(s,'?',' ',[rfReplaceAll]); s:=StringReplace(s,'(',' ',[rfReplaceAll]); s:=StringReplace(s,')',' ',[rfReplaceAll]); s:=StringReplace(s,'[',' ',[rfReplaceAll]); s:=StringReplace(s,']',' ',[rfReplaceAll]); s:=StringReplace(s,'{',' ',[rfReplaceAll]); s:=StringReplace(s,'}',' ',[rfReplaceAll]); s:=StringReplace(s,'-',' ',[rfReplaceAll]); s:=StringReplace(s,'_',' ',[rfReplaceAll]); while(pos(' ',s)<>0) do s:=StringReplace(s,' ',' ',[rfreplaceall]); //убираем лишние пробелы str.text :=StringReplace(s, ' ', #13#10, [rfReplaceAll]); //Заменяем пробелы на перевод строки ShowMessage('Число слов в тексте '+ IntToStr(str.Count)); str.free; end;
А вот таким образом осуществляется выбор вкладки
procedure TForm2.N14Click(Sender: TObject); {undo} begin case PageControl1.ActivePageIndex of 0 : Memo1.Undo; 1 : Memo2.Undo; 2 : Memo3.Undo; end; end; procedure TForm2.N15Click(Sender: TObject); begin case PageControl1.ActivePageIndex of {delete} 0 : Memo1.ClearSelection; 1 : Memo2.ClearSelection; 2 : Memo3.ClearSelection; end; end;
А вот процедура открытия файлов с проверкой на их присутствие.
procedure TForm2.N6Click(Sender: TObject); {open} begin if OpenDialog1.Execute then begin FileWork:=OpenDialog1.FileName; if Pos('.',FileWork)<> 0 then FileWork:= Copy(OpenDialog1.FileName, 1, Length(OpenDialog1.FileName)-4); Memo1.Lines.LoadFromFile(FileWork+'.txt'); if FileExists(FileWork+'.dbs') then Memo2.Lines.LoadFromFile(FileWork+'.dbs'); if FileExists(FileWork+'.dbp') then Memo3.Lines.LoadFromFile(FileWork+'.dbp'); Memo1.Modified:= false; end; end;
Поделиться42018-01-10 23:35:10
Процедура поиска
procedure TForm2.FindDialog1Find(Sender: TObject); var Found, StartPos: Integer; begin if PageControl1.ActivePageIndex = 0 then begin if Memo1.SelLength <> 0 then StartPos := Memo1.SelStart + Memo1.SelLength else StartPos := 0; Found := PosEx(FindDialog1.FindText, Memo1.Text, StartPos + 1); if Found <> 0 then begin Memo1.HideSelection := False; Memo1.SelStart := Found - 1; Memo1.SelLength := Length(FindDialog1.FindText); end else ShowMessage('Строка '+FindDialog1.FindText+' не найдена!'); end; if PageControl1.ActivePageIndex = 1 then begin if Memo2.SelLength <> 0 then StartPos := Memo2.SelStart + Memo2.SelLength else StartPos := 0; Found := PosEx(FindDialog1.FindText, Memo2.Text, StartPos + 1); if Found <> 0 then begin Memo2.HideSelection := False; Memo2.SelStart := Found - 1; Memo2.SelLength := Length(FindDialog1.FindText); end else ShowMessage('Строка '+FindDialog1.FindText+' не найдена!'); end; if PageControl1.ActivePageIndex = 2 then begin if Memo3.SelLength <> 0 then StartPos := Memo3.SelStart + Memo3.SelLength else StartPos := 0; Found := PosEx(FindDialog1.FindText, Memo3.Text, StartPos + 1); if Found <> 0 then begin Memo3.HideSelection := False; Memo3.SelStart := Found - 1; Memo3.SelLength := Length(FindDialog1.FindText); end else ShowMessage('Строка '+FindDialog1.FindText+' не найдена!'); end; end;
Для PosEx надо подключить StrUtils
Поделиться52018-01-10 23:41:16
Ну вот основные процедуры показал, всё остальное не сложно сделать. ещё обсуждалось по этой программе здесь:
множественное открытие-сохранение
Я хочу обсудить дальнейшее улучшение программы, какие нужны дополнительные возможности.
Изначально писал программу для себя, так как занимаюсь написанием длинных текстов и
знаю, что мне надо. Но люди разные, у всех есть свои потребности.
Поделиться62018-01-12 01:10:54
Программу писал на Delphi 10.2 Tokyo Starter ! Это бесплатная урезанная версия.
Также тестировал на старенькой бесплатной Turbo Delphi
Lazarus не корректно работает с кириллицей, надо вносить изменения. И убрать процедуру поиска.
Главное изменение для Lazarus :
Добавить в uses LazUTF8
Form2.Memo1.Lines.SaveToFile(Utf8ToSys(FileWork+'.txt')) и т.д.
Процедура
procedure TForm1.FindDialog1Find(Sender: TObject); begin if UTF8Pos(FindDialog1.FindText, memo1.Text)<>0 then begin with Memo1 do begin HideSelection := False; SelStart := UTF8Pos(FindDialog1.FindText, Text)-1; SelLength := UTF8Length(FindDialog1.FindText); end; end else ShowMessage('Строка '+FindDialog1.FindText+' не найдена!'); end;
Эта процедура будет искать только первое вхождение. Чтобы был дальнейший поиск надо вводить переменные и дублировать строку для поиска отрезая всё что было в предыдущем поиске. Я не стал писать эту процедуру, она значительно медлительнее, и в принципе в программе можно и без неё обойтись.
Поделиться72019-06-03 07:10:34
Переписал код, убрав глюки и недоделки!
Во первых добавил процедуру сохранения
procedure ddd; {save} begin If FileWork='' then SaveAs else begin Form2.Memo1.Lines.SaveToFile(FileWork+'.txt'); Form2.Memo2.Lines.SaveToFile(FileWork+'.dbs'); Form2.Memo3.Lines.SaveToFile(FileWork+'.dbp'); end; end;
Также ввёл проверку модификации во все процедуры открытия и выхода.
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin if Memo1.Modified or Memo2.Modified or Memo3.Modified then ddd; end;
procedure TForm2.N5Click(Sender: TObject); {sozdat'} begin if Memo1.Modified or Memo2.Modified or Memo3.Modified then begin ddd; end; Memo1.Clear; Memo2.Clear; Memo3.Clear; Memo1.Modified:= false; SaveDialog1.FileName:= ''; FileWork:= ''; end; procedure TForm2.N6Click(Sender: TObject); {open} begin if Memo1.Modified or Memo2.Modified or Memo3.Modified then ddd; if OpenDialog1.Execute then begin FileWork:=OpenDialog1.FileName; if Pos('.',FileWork)<> 0 then FileWork:= Copy(OpenDialog1.FileName, 1, Length(OpenDialog1.FileName)-4); Memo1.Lines.LoadFromFile(FileWork+'.txt'); if FileExists(FileWork+'.dbs') then Memo2.Lines.LoadFromFile(FileWork+'.dbs'); if FileExists(FileWork+'.dbp') then Memo3.Lines.LoadFromFile(FileWork+'.dbp'); Memo1.Modified:= false; end; end;
Тестирование прошло успешно.
Поделиться82019-06-03 08:36:29
Доработал открытием недавнего файла, использовал INI файл.
Вот изменения в процедурах сохранения.
Procedure SaveAs; begin If Form2.SaveDialog1.Execute then begin FileWork:=Form2.SaveDialog1.FileName; if Pos('.',FileWork)<> 0 then FileWork:= Copy(Form2.SaveDialog1.FileName, 1, Length(Form2.SaveDialog1.FileName)-4); Form2.Memo1.Lines.SaveToFile(FileWork+'.txt'); Form2.Memo2.Lines.SaveToFile(FileWork+'.dbs'); Form2.Memo3.Lines.SaveToFile(FileWork+'.dbp'); oldfile:= FileWork; sIniFile.WriteString('TEST', 'EditVal', oldfile); end; end; procedure ddd; {save} begin If FileWork='' then SaveAs else begin oldfile:= FileWork; sIniFile.WriteString('TEST', 'EditVal', oldfile); Form2.Memo1.Lines.SaveToFile(FileWork+'.txt'); Form2.Memo2.Lines.SaveToFile(FileWork+'.dbs'); Form2.Memo3.Lines.SaveToFile(FileWork+'.dbp'); end; end;
Инициализация
procedure TForm2.FormCreate(Sender: TObject); begin pathINI:=extractfilepath(application.ExeName)+'\example.ini'; sIniFile := TIniFile.Create(pathINI); Memo1.Clear; Memo2.Clear; Memo3.Clear; end;
Ну и процедура открытия
procedure TForm2.N22Click(Sender: TObject); begin if Memo1.Modified or Memo2.Modified or Memo3.Modified then ddd; if FileExists(pathINI) then //проверяем есть ли файл INI begin FileWork:=sIniFile.ReadString('TEST', 'EditVal', 'Раздел не найден!'); if FileExists(FileWork+'.txt') then Memo1.Lines.LoadFromFile(FileWork+'.txt'); if FileExists(FileWork+'.dbs') then Memo2.Lines.LoadFromFile(FileWork+'.dbs'); if FileExists(FileWork+'.dbp') then Memo3.Lines.LoadFromFile(FileWork+'.dbp'); Memo1.Modified:= false; end else ShowMessage('Нет недавних файлов, сначала сохраните'); end;
Поделиться92019-06-03 08:59:36
Я перезалил на https://disk.yandex.co.il/d/be9g8MsO1fkTCA самую свежую версию в архиве вместе с исходниками.
Буду ещё некоторое время тестировать и фиксить при обнаружении проблем. А потом приступлю к серьёзным обновлениям функционала, уже есть несколько идей.