|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#76
|
|||
|
|||
Цитата:
Ну, т.к. все отвалили (утверждают, что временно), потратил пару часов в выходные и реализовал часть функций в программе. Исходники прилагаются... Возможно, сделаю работу с файлом простым методом... И все-таки, кто-то обещал разобраться как "впихнуть" свой ComboBox в стандартный диалог сохранения. Я, конечно, как дойду до этого, сам разберусь... но получается, что у нас не совсем команда, а разработчик и группа сочувствующих... |
#77
|
||||
|
||||
Цитата:
Напрямую из неё снимать можно. Даже где-то видел почти готовый код (для оптимизации можно доточить напильником). А вот хук на принт скрин - сложнее, таскать за собой длл не охота. Хотя, её можно вкомпилить в ресурсы - это мелочи. Цитата:
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 26.07.2010 в 21:24. |
#78
|
|||
|
|||
Путь в использовании CallBack'ов. У меня есть компонент, реализующий стандарный selectDirectory, так вот там через CallBack добавляется доп. контрол в стандартный системный диалог. Так и тут. Просто пока у меня нет времени с этим разбираться. Так же, не помню где, но была утилита, которая во все диалоги (в чужих программах тоже) вешала ComboBox для быстрого перехода в разные папки. Там уж точно никаких своих диалогов не делалось.
Да, еще просьба. Надо собрать код и проверить под отладчиком вызов справки. У меня почему-то именно в этом проекте если вызвать справку, то при закрытии приложения происходит "обвал". при этом без отладчика все ОК. И в другом проекте, где тоже используется точно такой же код тоже все ОК... |
#79
|
||||
|
||||
Цитата:
bin+source http://rghost.ru/2208211 TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#80
|
||||
|
||||
Как добавить свой контрол в стандартный диалог
Если надо - могу реализовать, только дайте скрин (набросок) того, что нужно сделать Впринципе, готовое решение (вполне интуитивно понятное), перед глазами с самого начала...и зовется оно TOpenPictureDialog. Взгляните на его реализацию. |
#81
|
|||
|
|||
Берем стандартный notepad, вызываем диалог сохранения. Там внизу увидишь дополнительный ComboBox со списком внутренних форматов текстового файла. Вот оно и надо...
ЗЫ. Ну что, никто у себя вызов справки не проверил??? |
#82
|
|||
|
|||
Такс, тут вчера написался некоторый код:
Код:
unit FileManager; interface uses Classes, SysUtils, Forms; const cCaption = 'Notepad'; cNewFileName = 'Untitled.txt'; type TTextFileFormat = (ffAnsi, ffUTF8, ffUTF16); { TTextFileManager } TTextFileManager = class private FMainForm : TForm; FFileName : String; FFileFormat : TTextFileFormat; protected procedure ApplyFileName; function GetFileEncoding(AStream : TStream) : TTextFileFormat; procedure WriteAnsiFile(AStream : TStream; AData : String); procedure WriteUTF8File(AStream : TStream; AData : String); procedure WriteUTF16File(AStream : TStream; AData : String); function ReadAnsiFile(AStream : TStream) : String; function ReadUTF8File(AStream : TStream) : String; function ReadUTF16File(AStream : TStream) : String; public constructor Create(AMainForm : TForm); virtual; destructor Destroy; override; function NeedName : Boolean; procedure New; function Load(AFileName : String) : String; procedure Save(AData : String); overload; procedure Save(AFileName : String; AData : String; AFormat : TTextFileFormat = ffAnsi); overload; property FileName : String read FFileName; property FileFormat : TTextFileFormat read FFileFormat; end; implementation const hdrUTF8 : String = #$EF#$BB; hdrUTF8W : String = #$BF; hdrUTF16 : String = #$FE#$FF; hdrUTF32 : String = #$FF#$FE; { TTextFileManager } procedure TTextFileManager.ApplyFileName; begin FMainForm.Caption := Format('%s - %s',[cCaption,FFileName]); Application.Title := Format('%s - %s',[cCaption,FFileName]); end; function TTextFileManager.GetFileEncoding(AStream: TStream): TTextFileFormat; var Hdr : String; begin Hdr := ''; If AStream.Size < 3 Then Result := ffAnsi Else Begin AStream.Seek(0,soFromBeginning); SetLength(Hdr,2); AStream.ReadBuffer(Hdr[1],2); If Hdr = hdrUTF8 Then Result := ffUTF8 Else If (Hdr = hdrUTF16) Or (Hdr = hdrUTF32) Then Result := ffUTF16 Else Result := ffAnsi; End; end; procedure TTextFileManager.WriteAnsiFile(AStream: TStream; AData: String); begin AStream.Seek(0,soFromBeginning); AStream.WriteBuffer(AData[1],Length(AData)); end; procedure TTextFileManager.WriteUTF8File(AStream: TStream; AData: String); var Buf : UTF8String; begin Buf := AnsiToUTF8(AData); AStream.WriteBuffer(hdrUTF8[1],2); AStream.WriteBuffer(hdrUTF8W[1],1); AStream.WriteBuffer(Buf[1],Length(Buf)); end; procedure TTextFileManager.WriteUTF16File(AStream: TStream; AData: String); begin Raise Exception.Create('Not implemented yet.'); end; function TTextFileManager.ReadAnsiFile(AStream: TStream): String; begin AStream.Seek(0,soFromBeginning); SetLength(Result,AStream.Size); AStream.ReadBuffer(Result[1],AStream.Size); end; function TTextFileManager.ReadUTF8File(AStream: TStream): String; var Buf : UTF8String; begin AStream.Seek(3,soFromBeginning); SetLength(Buf,AStream.Size-3); AStream.ReadBuffer(Buf[1],AStream.Size-3); Result := UTF8ToAnsi(Buf); end; function TTextFileManager.ReadUTF16File(AStream: TStream): String; begin Raise Exception.Create('Not implemented yet.'); AStream.Seek(2,soFromBeginning); Result := ''; end; constructor TTextFileManager.Create(AMainForm: TForm); begin inherited Create; If AMainForm = Nil Then Raise Exception.Create('Main form isn''t passed.'); FMainForm := AMainForm; New; end; destructor TTextFileManager.Destroy; begin inherited Destroy; end; function TTextFileManager.NeedName: Boolean; begin Result := FFileName = cNewFileName; end; procedure TTextFileManager.New; begin FFileName := cNewFileName; FFileFormat := ffAnsi; ApplyFileName; end; function TTextFileManager.Load(AFileName: String) : String; var AStream : TFileStream; AFormat : TTextFileFormat; begin AStream := TFileStream.Create(AFileName,fmOpenRead Or fmshareDenyWrite); Try AFormat := GetFileEncoding(AStream); Case AFormat Of ffUTF8 : Result := ReadUTF8File(AStream); ffUTF16 : Result := ReadUTF16File(AStream); Else Result := ReadAnsiFile(AStream); End; FFileName := AFileName; FFileformat := AFormat; ApplyFileName; Finally AStream.Free; End; end; procedure TTextFileManager.Save(AData : String); begin Save(FFileName,AData,FFileformat); end; procedure TTextFileManager.Save(AFileName: String; AData : String; AFormat: TTextFileFormat = ffAnsi); var AStream : TFileStream; begin AStream := TFileStream.Create(AFileName,fmCreate); Try Case AFormat Of ffUTF8 : WriteUTF8File(AStream, AData); ffUTF16 : WriteUTF16File(AStream, AData); Else WriteAnsiFile(AStream, AData); End; FFileName := AFileName; FFileformat := AFormat; ApplyFileName; Finally AStream.Free; End; end; end. Желающие потестировать и дописать (конвертацию Ansi->Uniocode->Ansi) wellcome! |
#83
|
|||
|
|||
Да, пример использования для проверки:
1. Кидаем на форму Memo1 и Button1. 2. Подключаем модуль. 3. Пишем такой код: Код:
procedure TForm1.Button1Click(Sender: TObject); var M : TTextFileManager; begin M := TTextFileManager.Create(Self); Try Memo1.Lines.Text := M.Load('c:\ansi.txt'); Finally M.Free; End; end; ЗЫ. файл лежит в корне диска C: Особо пытливые могут прикрутить выбор файла через диалог. Файлы можно формировать с помощью стандартного нотепада. Поддерживаются Ansi, UTF8. При попытке открыть Unicode будет эксепшн (ну не сделал пока, желаюшие из проекта могут попробовать дописать). Все файлы, не распознанные как UTF8 или Unicode, открываются как ansi, т.е. считаются чистым текстом. |
#84
|
|||
|
|||
Ну что-то все пропали...
Выкладываю обновленные сырцы прокта. Добавления: - Интегрирован вчерашний код; - Сделано открытие документа и создание нового; - Сделано сохраниение документа. Сохранить как НЕ СДЕЛАНО. - Реализована пара служебных вещей, типа отображения позиции курсора в строке состояния. Напоминаю, что записавшиеся в проект могут внести свою посильную лепту. Что надо: 1. Дописать конвертацию Uniocode-Ansi-Unicode. 2. Сделать функцию, расширяющую стандатрый диалог сохранения файла (нужен ComboBox для выбора внутреннего формата файла - Ansi, UTF8, Unicode). |
#85
|
||||
|
||||
Цитата:
По теме: У меня такое чувство, что я лучше займусь другими элементами - чтот я себе уже полмозга вынес этими кодировками... (в то время, пока не мог кодить, лазал по сайтам и курил мануалы). Например, тот же "скриншотер" допишу Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#86
|
|||
|
|||
Может все-таки один проект доделаем???
Честно говоря, я не рассчитывал писать все сам, думал, что буду в основном координировать разработку. А получается, что пишу в основном я. Да, кстати, ходил на сайт. Мне понравилось. Хотя хочется спрятать некоторые разделы, которые, по крайней мере пока, не нужны. |
#87
|
||||
|
||||
Доделаем... ладно, я сейчас поброжу по просторам харддрайва, соберу всё что накопал, проверю, систематизирую и вылью сюда.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#88
|
|||
|
|||
Гм... может просто возьмешь сырцы и сделаешь диаложек?
По поводу Unicode -просто руки дома не дошли, а то там должно быть все просто. Есть 2 функции в стандариной библиотеке: UnicodeToUTF8 и UTF8ToAnsi (ну и обратные к ним). Мне кажется, что этой комбинации достаточно для чтения Unicode файла. Да, еще печатью кому-нить надо заняться. А так же поиском и заменой. Я, конечно, сделаю, но вот когда руки дойдут просто не знаю. В ближайших планах "прикрутить" drop из проводника и передачу файла через параметр. Это на эти выходные. Итого, что требует разработки: - диалог сохранения с выбором внутреннего формата файла; - чтение/запись Unicode файлов (может сам сделаю); - настройка печати (мысли по этому поводу чуть ниже); - собственно печать; - поиск в документе; - замена в документе. |
#89
|
|||
|
|||
Итак. Свежая версия исходников.
Сделано: - расчет статистики по документу (выводится пока самым простым способом); - переход на строку по номеру; - включил отображение нумерации строк (видимо, во время жэкспериментов оказалась отключена). Что требует разработки: Итого, что требует разработки: - диалог сохранения с выбором внутреннего формата файла; - чтение/запись Unicode файлов (может сам сделаю); - открытие файла из командной строки (план на выходные); - открытие файла через drag'n'drop (план на выходные); - настройка печати (мысли по этому поводу чуть ниже); - собственно печать; - поиск в документе; - замена в документе; - справка в формате .chm - установщик (мысли по этому поводу чуть ниже); - диалог настройки (пока только шрифт). Теперь мысли. 1. Настройка печати. Первое. Собственно, что хочется настраивать: - размер полей (слева, справа, сверху снизу); - вывод нумерации страниц (номер или номер из всего, номер на первой стр., выводить вверху или внизу); - вывод имени документа (невыводить, вверу, внизу). Второе. Что-то мне кажется, что можно убрать отдельный пункт настройки печати из меню с делать это в общих настройках. Хотя есть выриант иметь общие настройки + настройки для конкретного документа (в момент создания нового документа или открытия существующего общие настройки переписываются в локальные). Это надо бы обсудить. Хотя для простоты можно сделать пока только локальные, но работающие на данный момент как глобальные. 2. Установщик. Первое. Считаю, что писать свой установщик смысле не имеет. Посему берем то, что проверено. Предлагаю взять InnoSetup. Тем более, что там можно писать свой код. Второе. Мне кажется, что надо сделать 2 возможности установки: - установка как отдельной программы; - установка заменой стандартных программ. С первым вариантом все понятно. Просто стандартная установка. Второй вариант подразумевает бэкап существующей программы и замена ее нашей версией. Вот тут как раз пригодится возможность писать свой код в инсталяторе. Собственно, эта мысль была изначально - текущее приложение проекта называется notepad, ничего не напоминает? Теперь несколько мыслей о будущем. В следующих версиях надо/можно будет (с)делать: - вывод статистики в более красивом окошке; - вставка символа (см как сделано в MS Word); - вставка файла (тоже текстового); - предварительный просмотр для печати; - закладки; - доп. настройки (цвет шрифта и фона для особо ушибленных - нам не сложно, а кому-то радость, мож еще какие настройки приделаем); - параметры страницы (то, что описано выше - в полном объеме); - ну еще по ходу что-то придумается... идеи есть, но их применимость надо обсуждать... |
#90
|
||||
|
||||
Ладно, щас скачаем, покурим... Я могу заняться поиском и заменой, кстати, благо опыт есть.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |