![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#76
|
|||
|
|||
|
Цитата:
Ну, т.к. все отвалили (утверждают, что временно), потратил пару часов в выходные и реализовал часть функций в программе. Исходники прилагаются... Возможно, сделаю работу с файлом простым методом... И все-таки, кто-то обещал разобраться как "впихнуть" свой ComboBox в стандартный диалог сохранения. Я, конечно, как дойду до этого, сам разберусь... но получается, что у нас не совсем команда, а разработчик и группа сочувствующих... |
|
#77
|
||||
|
||||
|
Цитата:
Напрямую из неё снимать можно. Даже где-то видел почти готовый код (для оптимизации можно доточить напильником). А вот хук на принт скрин - сложнее, таскать за собой длл не охота. Хотя, её можно вкомпилить в ресурсы - это мелочи. Цитата:
Последний раз редактировалось PhoeniX, 26.07.2010 в 21:24. |
|
#78
|
|||
|
|||
|
Путь в использовании CallBack'ов. У меня есть компонент, реализующий стандарный selectDirectory, так вот там через CallBack добавляется доп. контрол в стандартный системный диалог. Так и тут. Просто пока у меня нет времени с этим разбираться. Так же, не помню где, но была утилита, которая во все диалоги (в чужих программах тоже) вешала ComboBox для быстрого перехода в разные папки. Там уж точно никаких своих диалогов не делалось.
Да, еще просьба. Надо собрать код и проверить под отладчиком вызов справки. У меня почему-то именно в этом проекте если вызвать справку, то при закрытии приложения происходит "обвал". при этом без отладчика все ОК. И в другом проекте, где тоже используется точно такой же код тоже все ОК... |
|
#79
|
||||
|
||||
|
Цитата:
я пока что тоже немного другим занят, небольшие наработки выложу, может кто продолжит, код мудрёный сразу предупреждаюbin+source http://rghost.ru/2208211 |
|
#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
|
||||
|
||||
|
Цитата:
По теме: У меня такое чувство, что я лучше займусь другими элементами - чтот я себе уже полмозга вынес этими кодировками... (в то время, пока не мог кодить, лазал по сайтам и курил мануалы). Например, тот же "скриншотер" допишу ![]() |
|
#86
|
|||
|
|||
|
Может все-таки один проект доделаем???
Честно говоря, я не рассчитывал писать все сам, думал, что буду в основном координировать разработку. А получается, что пишу в основном я. Да, кстати, ходил на сайт. Мне понравилось. Хотя хочется спрятать некоторые разделы, которые, по крайней мере пока, не нужны. |
|
#87
|
||||
|
||||
|
Доделаем... ладно, я сейчас поброжу по просторам харддрайва, соберу всё что накопал, проверю, систематизирую и вылью сюда.
|
|
#88
|
|||
|
|||
|
Гм... может просто возьмешь сырцы и сделаешь диаложек?
По поводу Unicode -просто руки дома не дошли, а то там должно быть все просто. Есть 2 функции в стандариной библиотеке: UnicodeToUTF8 и UTF8ToAnsi (ну и обратные к ним). Мне кажется, что этой комбинации достаточно для чтения Unicode файла. Да, еще печатью кому-нить надо заняться. А так же поиском и заменой. Я, конечно, сделаю, но вот когда руки дойдут просто не знаю. В ближайших планах "прикрутить" drop из проводника и передачу файла через параметр. Это на эти выходные. Итого, что требует разработки: - диалог сохранения с выбором внутреннего формата файла; - чтение/запись Unicode файлов (может сам сделаю); - настройка печати (мысли по этому поводу чуть ниже); - собственно печать; - поиск в документе; - замена в документе. |
|
#89
|
|||
|
|||
|
Итак. Свежая версия исходников.
Сделано: - расчет статистики по документу (выводится пока самым простым способом); - переход на строку по номеру; - включил отображение нумерации строк (видимо, во время жэкспериментов оказалась отключена). Что требует разработки: Итого, что требует разработки: - диалог сохранения с выбором внутреннего формата файла; - чтение/запись Unicode файлов (может сам сделаю); - открытие файла из командной строки (план на выходные); - открытие файла через drag'n'drop (план на выходные); - настройка печати (мысли по этому поводу чуть ниже); - собственно печать; - поиск в документе; - замена в документе; - справка в формате .chm - установщик (мысли по этому поводу чуть ниже); - диалог настройки (пока только шрифт). Теперь мысли. 1. Настройка печати. Первое. Собственно, что хочется настраивать: - размер полей (слева, справа, сверху снизу); - вывод нумерации страниц (номер или номер из всего, номер на первой стр., выводить вверху или внизу); - вывод имени документа (невыводить, вверу, внизу). Второе. Что-то мне кажется, что можно убрать отдельный пункт настройки печати из меню с делать это в общих настройках. Хотя есть выриант иметь общие настройки + настройки для конкретного документа (в момент создания нового документа или открытия существующего общие настройки переписываются в локальные). Это надо бы обсудить. Хотя для простоты можно сделать пока только локальные, но работающие на данный момент как глобальные. 2. Установщик. Первое. Считаю, что писать свой установщик смысле не имеет. Посему берем то, что проверено. Предлагаю взять InnoSetup. Тем более, что там можно писать свой код. Второе. Мне кажется, что надо сделать 2 возможности установки: - установка как отдельной программы; - установка заменой стандартных программ. С первым вариантом все понятно. Просто стандартная установка. Второй вариант подразумевает бэкап существующей программы и замена ее нашей версией. Вот тут как раз пригодится возможность писать свой код в инсталяторе. Собственно, эта мысль была изначально - текущее приложение проекта называется notepad, ничего не напоминает? Теперь несколько мыслей о будущем. В следующих версиях надо/можно будет (с)делать: - вывод статистики в более красивом окошке; - вставка символа (см как сделано в MS Word); - вставка файла (тоже текстового); - предварительный просмотр для печати; - закладки; - доп. настройки (цвет шрифта и фона для особо ушибленных - нам не сложно, а кому-то радость, мож еще какие настройки приделаем); - параметры страницы (то, что описано выше - в полном объеме); - ну еще по ходу что-то придумается... идеи есть, но их применимость надо обсуждать... |
|
#90
|
||||
|
||||
|
Ладно, щас скачаем, покурим... Я могу заняться поиском и заменой, кстати, благо опыт есть.
|