Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Флейм
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #76  
Старый 26.07.2010, 20:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
/me временно выбыл, т.к. был занят некоторыми задачами...

Ну, т.к. все отвалили (утверждают, что временно), потратил пару часов в выходные и реализовал часть функций в программе. Исходники прилагаются... Возможно, сделаю работу с файлом простым методом...

И все-таки, кто-то обещал разобраться как "впихнуть" свой ComboBox в стандартный диалог сохранения. Я, конечно, как дойду до этого, сам разберусь... но получается, что у нас не совсем команда, а разработчик и группа сочувствующих...
Вложения
Тип файла: zip notepad.zip (23.4 Кбайт, 12 просмотров)
Ответить с цитированием
  #77  
Старый 26.07.2010, 21:16
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Проблема всех подобных утилит - это "снятие" картинки из DirectX приложения.
....
(из видеопамяти что-ли читать картинку...).
Не только DirectX, а всех графических движков, напрямую работающих с видеопамятью.

Напрямую из неё снимать можно. Даже где-то видел почти готовый код (для оптимизации можно доточить напильником). А вот хук на принт скрин - сложнее, таскать за собой длл не охота. Хотя, её можно вкомпилить в ресурсы - это мелочи.
Цитата:
Сообщение от lmikle
И все-таки, кто-то обещал разобраться как "впихнуть" свой ComboBox в стандартный диалог сохранения.
Я искал, не нашёл, но стопудово где-то видел. Путь вроде в создании нового компонента на основе то ли самого опен/сейв-диалога, то ли на основе TCustomDialog...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 26.07.2010 в 21:24.
Ответить с цитированием
  #78  
Старый 26.07.2010, 22:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Путь в использовании CallBack'ов. У меня есть компонент, реализующий стандарный selectDirectory, так вот там через CallBack добавляется доп. контрол в стандартный системный диалог. Так и тут. Просто пока у меня нет времени с этим разбираться. Так же, не помню где, но была утилита, которая во все диалоги (в чужих программах тоже) вешала ComboBox для быстрого перехода в разные папки. Там уж точно никаких своих диалогов не делалось.

Да, еще просьба.
Надо собрать код и проверить под отладчиком вызов справки. У меня почему-то именно в этом проекте если вызвать справку, то при закрытии приложения происходит "обвал". при этом без отладчика все ОК. И в другом проекте, где тоже используется точно такой же код тоже все ОК...
Ответить с цитированием
  #79  
Старый 27.07.2010, 08:56
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от lmikle
Ну, т.к. все отвалили (утверждают, что временно)
а то он и энтузиазм я пока что тоже немного другим занят, небольшие наработки выложу, может кто продолжит, код мудрёный сразу предупреждаю

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  
Старый 27.07.2010, 09:38
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Как добавить свой контрол в стандартный диалог

Если надо - могу реализовать, только дайте скрин (набросок) того, что нужно сделать

Впринципе, готовое решение (вполне интуитивно понятное), перед глазами с самого начала...и зовется оно TOpenPictureDialog. Взгляните на его реализацию.
Ответить с цитированием
  #81  
Старый 27.07.2010, 10:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Берем стандартный notepad, вызываем диалог сохранения. Там внизу увидишь дополнительный ComboBox со списком внутренних форматов текстового файла. Вот оно и надо...

ЗЫ. Ну что, никто у себя вызов справки не проверил???
Ответить с цитированием
  #82  
Старый 28.07.2010, 22:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Такс, тут вчера написался некоторый код:

Код:
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  
Старый 29.07.2010, 03:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да, пример использования для проверки:
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  
Старый 29.07.2010, 23:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну что-то все пропали...

Выкладываю обновленные сырцы прокта. Добавления:
- Интегрирован вчерашний код;
- Сделано открытие документа и создание нового;
- Сделано сохраниение документа. Сохранить как НЕ СДЕЛАНО.
- Реализована пара служебных вещей, типа отображения позиции курсора в строке состояния.

Напоминаю, что записавшиеся в проект могут внести свою посильную лепту. Что надо:
1. Дописать конвертацию Uniocode-Ansi-Unicode.
2. Сделать функцию, расширяющую стандатрый диалог сохранения файла (нужен ComboBox для выбора внутреннего формата файла - Ansi, UTF8, Unicode).
Вложения
Тип файла: zip Notepad.zip (26.2 Кбайт, 15 просмотров)
Ответить с цитированием
  #85  
Старый 30.07.2010, 20:25
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Noize Suppressor @ Qlimax 2009
We fuckin' made it!!!
Поставил наконец нормально делфи на свой глюкобук... Правда через одно место, что называется, "камасутра не предвидела"... но дас ыст факт - работает.

По теме:
У меня такое чувство, что я лучше займусь другими элементами - чтот я себе уже полмозга вынес этими кодировками... (в то время, пока не мог кодить, лазал по сайтам и курил мануалы). Например, тот же "скриншотер" допишу
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #86  
Старый 30.07.2010, 20:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Может все-таки один проект доделаем???
Честно говоря, я не рассчитывал писать все сам, думал, что буду в основном координировать разработку. А получается, что пишу в основном я.

Да, кстати, ходил на сайт. Мне понравилось. Хотя хочется спрятать некоторые разделы, которые, по крайней мере пока, не нужны.
Ответить с цитированием
  #87  
Старый 30.07.2010, 20:59
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Доделаем... ладно, я сейчас поброжу по просторам харддрайва, соберу всё что накопал, проверю, систематизирую и вылью сюда.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #88  
Старый 30.07.2010, 22:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Гм... может просто возьмешь сырцы и сделаешь диаложек?
По поводу Unicode -просто руки дома не дошли, а то там должно быть все просто. Есть 2 функции в стандариной библиотеке: UnicodeToUTF8 и UTF8ToAnsi (ну и обратные к ним). Мне кажется, что этой комбинации достаточно для чтения Unicode файла.

Да, еще печатью кому-нить надо заняться. А так же поиском и заменой.
Я, конечно, сделаю, но вот когда руки дойдут просто не знаю. В ближайших планах "прикрутить" drop из проводника и передачу файла через параметр. Это на эти выходные.

Итого, что требует разработки:
- диалог сохранения с выбором внутреннего формата файла;
- чтение/запись Unicode файлов (может сам сделаю);
- настройка печати (мысли по этому поводу чуть ниже);
- собственно печать;
- поиск в документе;
- замена в документе.
Ответить с цитированием
  #89  
Старый 31.07.2010, 01:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Итак. Свежая версия исходников.
Сделано:
- расчет статистики по документу (выводится пока самым простым способом);
- переход на строку по номеру;
- включил отображение нумерации строк (видимо, во время жэкспериментов оказалась отключена).

Что требует разработки:
Итого, что требует разработки:
- диалог сохранения с выбором внутреннего формата файла;
- чтение/запись Unicode файлов (может сам сделаю);
- открытие файла из командной строки (план на выходные);
- открытие файла через drag'n'drop (план на выходные);
- настройка печати (мысли по этому поводу чуть ниже);
- собственно печать;
- поиск в документе;
- замена в документе;
- справка в формате .chm
- установщик (мысли по этому поводу чуть ниже);
- диалог настройки (пока только шрифт).

Теперь мысли.
1. Настройка печати.
Первое. Собственно, что хочется настраивать:
- размер полей (слева, справа, сверху снизу);
- вывод нумерации страниц (номер или номер из всего, номер на первой стр., выводить вверху или внизу);
- вывод имени документа (невыводить, вверу, внизу).
Второе. Что-то мне кажется, что можно убрать отдельный пункт настройки печати из меню с делать это в общих настройках. Хотя есть выриант иметь общие настройки + настройки для конкретного документа (в момент создания нового документа или открытия существующего общие настройки переписываются в локальные). Это надо бы обсудить.
Хотя для простоты можно сделать пока только локальные, но работающие на данный момент как глобальные.

2. Установщик.
Первое. Считаю, что писать свой установщик смысле не имеет. Посему берем то, что проверено. Предлагаю взять InnoSetup. Тем более, что там можно писать свой код.
Второе. Мне кажется, что надо сделать 2 возможности установки:
- установка как отдельной программы;
- установка заменой стандартных программ.
С первым вариантом все понятно. Просто стандартная установка.
Второй вариант подразумевает бэкап существующей программы и замена ее нашей версией. Вот тут как раз пригодится возможность писать свой код в инсталяторе. Собственно, эта мысль была изначально - текущее приложение проекта называется notepad, ничего не напоминает?

Теперь несколько мыслей о будущем.
В следующих версиях надо/можно будет (с)делать:
- вывод статистики в более красивом окошке;
- вставка символа (см как сделано в MS Word);
- вставка файла (тоже текстового);
- предварительный просмотр для печати;
- закладки;
- доп. настройки (цвет шрифта и фона для особо ушибленных - нам не сложно, а кому-то радость, мож еще какие настройки приделаем);
- параметры страницы (то, что описано выше - в полном объеме);
- ну еще по ходу что-то придумается... идеи есть, но их применимость надо обсуждать...
Вложения
Тип файла: zip notepad.zip (28.2 Кбайт, 7 просмотров)
Ответить с цитированием
  #90  
Старый 31.07.2010, 12:21
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ладно, щас скачаем, покурим... Я могу заняться поиском и заменой, кстати, благо опыт есть.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter