Блокнот Графомана

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: Блокнот Графомана

Сообщение Лекс Айрин » 05.07.2016 15:45:21

обновил версию и сбросил код в архив.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Лекс Айрин » 09.07.2016 11:17:10

Что-то я запутался при создании класса. Причем, подозреваю, что по глупому :(

Код: Выделить всё
unit wordsUnits;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,Types, Dialogs;


Type

  PList=^List;
  List=record
    PForwards, PNext:PList;
    Words:String;
  end;



{ TListWords}


TListWords = class
private
    Start,PosList, Finish:PList;
    procedure SetItems(value:PList);virtual;

protected

public

   property first:PList read start;  // нет смысла в изменении данного указателя,
                                 // если только не  удаляется первый элемент
   property Item:PList read PosList write SetItems;    // указывает на текущий элемент списка
   property Last:PList read Finish;// write SetFinish;
   function next(value:Plist):PList;
   function next:PList;                // перегружено для удобства использования
   function pred (value:Plist):Plist;
   function pred:Plist;              // перегружено для удобства использования
   procedure Add (Str:String);   //добавляет в конец списка
   procedure Insert (Str:String);virtual; //добавляет в середину списка
   procedure Del (index:PList); virtual;
   function Cut (index:PList):Plist; virtual;
   function CopyWords (index:PList):PList; virtual;
   Procedure Clear; //очищает строку
   procedure readString (Str:String);virtual; //преобразование строки во внутренний формат
   Function WriteString:String;virtual;
   procedure writeWords(index:PList; Str:String);virtual; //работа с отдельными словами
   Function readWords (index:PList): String; virtual;
   constructor Create;
   destructor Destroy; override;
published
end;

TArrayWords=array of TListWords;// для вставки создания рабочей копии текста.
//

implementation

{ TListWords }

procedure TListWords.SetItems(value: PList);
begin
      PosList:=Value;
end;

function TListWords.next(value:Plist): PList;
begin
     Result:=value^.PNext;
end;

function TListWords.next: PList;
begin
      Result:=PosList^.PNext;
end;

function TListWords.pred (value:Plist): Plist;
begin
   Result:=value^.PForwards;
end;

function TListWords.pred: Plist;
begin
      Result:=PosList^.PForwards;
end;

procedure TListWords.Add(Str: String);
begin
      PosList:=Finish;
      Insert(Str);
end;

procedure TListWords.Insert(Str: String);
var
   point:PList;
begin
   New (Point);
   //проверка на пустоту списка
   //(в этом случае указатели нельзя просто перенести)
   if Start=nil then
   begin
     Start:=Point;
     Finish:=Point;
     PosList:=Point;
     //с заполнением полей немного неудобно, но думаю обойдется
     PosList^.Words:=Str;
     PosList^.PForwards:=nil; //можно start, но пока не буду
     PosList^.PNext:=nil;     //можно Finish, но пока не буду
   end

   else // что делать когда элемент один?

   //стандартная вставка
   Begin
        Point^.PNext:=PosList^.PNext; //переносим ссылки    Start=PosList!
        PosList^.PNext:=Point;
        PosList:=Point^.PNext;//"шагаем" на следующий после Point элемент
        Point^.PForwards:=PosList^.PForwards; //переносим ссылки
        PosList^.PForwards:=Point;
        PosList:=Point;  // указатель должен стоять на вставляемом элементе
        PosList^.Words:=Str;
   end;


end;

procedure TListWords.Del(index: PList);
begin
   if index=PosList then PosList:= next(PosList);//сдвигаем текущую позицию указателя чтобы он не повис
   Index^.PForwards^.PNext:=Index^.PForwards^.PNext^.PNext;  //обходим элемент
   Index^.PNext^.PForwards:=Index^.PNext^.PForwards^.PForwards;
   Dispose(Index);

end;

  function TListWords.Cut(index: PList): Plist;
begin
      Result:=CopyWords(Index);
      Del (index);

end;

  function TListWords.CopyWords(index: PList): PList;  //по идее, это должна быть функцияч, но((
begin
       Result^.PForwards:=nil;    // нас не интересуют адреса
       Result^.PNext:=nil;
       Result^.Words:=index^.Words;
end;

procedure TListWords.Clear;
begin


      while Start=finish do del(Start);  //проверить условие
         Start:=nil;
      PosList:=nil;
      Finish:=nil;
end;

//{
procedure TListWords.readString(Str: String);   //строка преобразуется в набор слов
var
  // tmpStr:String;
   count:integer;
begin
      //здесь потребуется создать элементы строки
      if Str='' then exit //на выход
      else
        begin
          if pos(' ',Str)=0 then
          begin //пробел не найден все в результат
            add (Str);
          end
          else
          begin
               //добавить проверку на пустоту строки
               count:=pos(' ',Str);
               if count=1 then begin end  // пробел на первой позиции
               else begin
               Add(System.Copy(Str,1,count-1));  //-1 чтобы не копировать пробел
               System.Delete(Str,1,count);
             end;
          end;
        end;
end;

function TListWords.WriteString: String;
begin
   PosList:=Start;
   Result:='';
   while PosList=Finish do  result:=Result+''+PosList^.Words;  //при использовании readString  пробелы убираются.

end;

  procedure TListWords.writeWords(index: PList; Str: String);
begin
   index^.Words:=Str;
end;

function TListWords.readWords (index:PList): String;
begin
        result:=index^.Words; //реально в "слове" могут быть пробелы и др. сисмволы
end;

constructor TListWords.Create;
begin
   inherited Create;
   ShowMessage('Ave!!!'); // окно не показывается!!!
   Start:=nil;
   PosList:=nil;
   Finish:=nil;

end;

destructor TListWords.Destroy;
begin

   Clear;

   inherited Destroy;
end;
//}

end.


и использование

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  WordsUnits;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Lisp:TListWords;//проверяемый класс

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
    Lisp.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Lisp.Add(Form1.Edit1.Caption);//.Destroy; здесь выбрасывает ошибку.
end;

end.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение MysticCoder » 09.07.2016 12:21:36

Lisp := TListWords.Create;
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Блокнот Графомана

Сообщение Лекс Айрин » 09.07.2016 12:25:52

Спасибо.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Ichthyander » 09.07.2016 14:36:54

Не стал изучать тему глубже. Вопрос, насколько удобен этот блокнот для работы с исходными текстами (PHP, HTML, JS, XML и т.д.)? Пользуюсь давно PSPad, с которого я перешел когда-то c NOtePad++ (не нравится он мне). Обилие функционала PSPad в принципе впечатляет. Почти все что нужно там есть, но вот есть за ним досадный глюк, иногда вставляет абракадабру в исходный текст. Иногда из-за этого возникают серьезные проблемы.
А тут вроде как бы и самому подправить можно, если что.Или он пока сыроват?
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Блокнот Графомана

Сообщение Лекс Айрин » 09.07.2016 15:03:00

Ichthyander, Глюк есть один -- не всегда до конца преобразует текст в html формат. Есть не до конца реализованный функционал. Да и тегов, если честно, маловато. Вообще, я буду расширять поддержку html.
Поддержки XML, JS, PHP нет, но никто не запрещает вбить на вкладке "Теги" все, что угодно. Или в заметки. Или можно добавить дополнительные вкладки.

В принципе, Добавить можно любой набор инструкций -- только долго. Если захочешь , то конечно можно и исходники подправить, только кинь патчик .
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Лекс Айрин » 02.08.2016 17:34:33

никто не подскажет как перемещать форму, удерживая ее вне заголовка.

Код для дельфи не рабочий.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение pupsik » 02.08.2016 21:46:04

т.е. перемещать форму используя контейнер?

т.е. нечто такого?
Код: Выделить всё
var
  MouseIsDown: boolean;
  PX, PY: integer;

procedure TForm1.<Component>MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    MouseIsDown := True;
    PX := X;
    PY := Y;
  end;
end;

procedure TForm1.<Component>MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MouseIsDown then
  begin
    SetBounds(Form1.Left + (X - PX), Form1.Top + (Y - PY), Form1.Width, Form1.Height);
  end;
end;

procedure TForm1.<Component>MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MouseIsDown:=False;
end;
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Блокнот Графомана

Сообщение Лекс Айрин » 03.08.2016 09:29:26

Идеально получилось. Спасибо.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Лекс Айрин » 04.08.2016 20:40:47

Заметил особенность при работе функции убирающей теги, что она при маленьком размере файла отрабатывает намного быстрее (построчно), чем при большом (иногда вообще практически замирает и вентилятор начинает верещать). Есть подозрение, что мне надо настроить размер кучи и/или стека. Я прав или есть какой-то еще нюанс(ы)?

ЗЫ: Есть ли какой-нибудь способ узнать плавающий конец конкретной строки в memo или нет? А то при большом размере текста преобразования портят разметку((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение zub » 05.08.2016 01:48:38

>>Я прав или есть какой-то еще нюанс(ы)?
Неправ. Нелинейная зависимость затрат времени от длины данных - типичное следствие "очень удобного" подхода viewtopic.php?f=5&t=11036#p95771
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 05.08.2016 11:07:46

zub, а ничего, что у меня идет отображение в мемо и добавление тегов не тормозит? Хотя согласно ВАШИМ словам должно точно так же должно подвешивать комп?
К тому же, преобразование в формат удобный для работы в ВАШЕМ стиле (с учетом слива результата в Мемо) должно добавить накладные расходы снижающие пользу от такого подхода. Возможно даже до нуля. (результат все равно придется присваивать обратно)
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение zub » 05.08.2016 11:31:35

>>zub, а ничего, что у меня идет...
ничего)) Настраивайте стек\кучу наздоровье - они тут совершенно непричем.

>>(с учетом слива результата в Мемо) должно добавить накладные расходы снижающие пользу от такого подхода. Возможно даже до нуля.
Если писать нормально - никто никому ничего не должен, просто программа работает максимально быстро
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 05.08.2016 12:22:22

zub писал(а):Настраивайте стек\кучу наздоровье - они тут совершенно непричем.


Это недолго проверить... заодно проверил и влияние оптимизации. И тоже нет взаимосвязи

zub писал(а):Если писать нормально - никто никому ничего не должен, просто программа работает максимально быстро


К сожалению, код не оторван от остальной программы. Поэтому нельзя просто взять и поменять реализацию процедуры. Отображать то все-равно придется в Мемо, а значит, и "неправильный подход" все равно вылезает. Вы то у себя работали с файлом/строками напрямую, а значит, в обход этих накладных расходов.
Я сейчас проверил, прямое преобразование тоже тормозит при большом размере, но не так сильно. А значит, придется все же менять реализацию(( К сожалению, тогда вылезет другой косяк -- тормоза до конца преобразования, что, для текстового редактора, практически сводит на нет возможность использования подобного функционала.

Я, кстати, проверил -- тормоза идут при работе со строками в целом, а не при выкусывании тегов.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение zub » 05.08.2016 15:08:34

>>Я, кстати, проверил -- тормоза идут при работе со строками в целом, а не при выкусывании тегов.
Чуть чуть поправлю - тормоза идут при неправильной работе - необязательно со строками (но с ними в первую очередь) - в целом))
Я сейчас проверил, ... . А значит, ... К сожалению, ..., что, для ... , практически сводит на нет возможность ...

Типичный отмазон.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

Рейтинг@Mail.ru