Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > подскажите формат


Автор: x77 17.6.2004, 22:49
нужна поддержка рисунков (бэкграунда и просто вставок) + обычный rtf. хтмл - идеальный вариант, но требуется редактирование WYSIWYG, т.е. юзер должен быт способен в самом редакторе вставлять картинки, настраивать, и видеть результаты. варианты типа вставки тегов с последующим превью - не прокатывают.

спасибо.

Автор: _hunter 18.6.2004, 16:10
и почему html не прокатывает?
в DreamVewer'e все происходит так, как было описанно smile.gif

P.S. можеш XML юзать

Автор: x77 18.6.2004, 17:13
_hunter, клиент хочет собственный редактор без всяких внешних editor'ов. в этом вся проблема. форматдолжен быть собственным, или, по крайней мере, выглядеть собственным.

Автор: _hunter 18.6.2004, 17:28
дык что значит собственный?
называться по другому? так назови его sphtml ( super-puper html )
или сам редактор выглядеть должен необычно? так схему ему чветовую поставь с избытком черного цвета

куч ведь редкторов такого типа есть: DreamVewer, CoffeCup, ... -- и никто не жалуется smile.gif

Автор: RA 18.6.2004, 18:20
Я пытаюсь понять суть вопроса. x77 а что ты пишешь (что за программа)?

Автор: x77 18.6.2004, 18:50
суть в следующем. одному буржую надо что-то типа картотеки по текстам. база данных с поиском и пр. блудней. со встроенным редактором, не внешним. чтобы можно было нажать на педаль, открылась форма, он ввёл в неё текст, сделал его жирным/синим/Arial/etc, задал фоновую картинку, при желании - навставлял ещё картинок уже не фоновых, а просто среди текста и т.д. формаровать всё это во внешнем редакторе он не хочет - это принципиальный вопрос. т.е. мне нужен некий формат, в котором я бы мог всё это реализовать. писать собственный html-редактор мне влом, деньги, которые платит буржуй того не стоят. а в richedit'е того, что он хочет не сделаешь. вот я и думаю, как бы извратиться и всё это сотворить.

Автор: Albinos_x 18.6.2004, 19:32
Попробуй через сервер Word-а, а потом делай сохранение как Веб страницу

Автор: RA 18.6.2004, 20:13
x77 ну раз такой буржуй то лично smile.gif я взялбы какойнить html-редактор и отредактировалбы его какимнить Редактором ресурсов.

Автор: December 19.6.2004, 00:18
Если проблема только в том, чтобы совместить ртф и бэкграунд, то совмести! Отдельно выбор рисунка, отдельно текст. Потом формируй хтмл и всё.

Автор: youri 19.6.2004, 17:43
По поводу формата: html - идеальный вариант для документов, которые нужны твоему буржую, а для тебя, по-моему,
Цитата
P.S. можеш XML юзать

Цитата
хтмл - идеальный вариант, но требуется редактирование WYSIWYG

Как вариант, в инете есть unit
http://www.jansfreeware.com/jfdelphi.htm#janxmltree
Правда, чувак пишет, что этот модуль в комерческих целях только с его разрешения использовать можно, к тому же периодически вспоминать его прийдется (его Jan Verhoeven зовут, а классы: TjanXMLTree, TjanXMLNode). Так что, если тебя это не смущает - можешь пользоваться smile.gif.


Автор: Felt 20.6.2004, 02:33
Хм, а почему бы не хранить свой текст в формате RTF в обычной локальной базе данных? Формат поля (мм... кажется называется ) ПОЛЕ ОБЪЕКТА OLE. Редактировать можно через DBRichEdit. В базе весь текст хранится в виде двоичного кода. Я всегда так делаю...

Автор: x77 21.6.2004, 13:25
Felt, в парадоксе это FormattedMemo, в остальных базах - обычный блоб. не канает, ибо смысл не в ртф, а в ртф + рисунки, которые стандартный ртф в багландовской реализации не поддерживает.

December, думал. проблема в том, что помимо бэкграунда буржуй хочет сепаратные рисунки в самом тексте. как он это себе представляет - его проблемы, у меня есть постановка: фон + рисунки в тексте + форматирование ртф + редактирование as is, т.е. на этапе редактирования юзер должен видеть конечный результат.

неужели придётся на rxlib переползать? sad.gif

Автор: z-END 21.6.2004, 21:10
x77
Мне вот тоже стало интересно как это осуществить... думаю двигаться надо в этом направлении:
Создать некое подобие Delphi DesignMode, собственно я етим и занимался целых два часаsmile.gif
все конечно очень криове даже Alpha версией не назовешь=), но все же... может такого же типа ченить сделаешь (только поприличней ну и не за два часа)... насамом деле интересная штука.
myEditor.pas
Код

unit myEditor;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, ComCtrls, StdCtrls, Buttons, ExtCtrls;

type
 TForm1 = class(TForm)
   Page: TScrollBox;
   Button3: TButton;
   Button2: TButton;
   DataEditor: TListBox;
   BitBtn1: TBitBtn;
   Button1: TButton;
   procedure BitBtn1Click (Sender: TObject);
   procedure ImgMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure ImgMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
   procedure TxtMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure TxtMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
   procedure ObjectSelect (Sender: TObject);
   procedure PageClick (Sender: TObject);
   procedure FormCreate (Sender: TObject);
   procedure DataEditorDblClick (Sender: TObject);
   procedure Button1Click (Sender: TObject);
   procedure Button2Click (Sender: TObject);
   procedure Button3Click (Sender: TObject);
 private
   procedure createImg(AName: String;  ALeft, ATop :Integer; Prop:Boolean);
   procedure createTxt(AName, AText:String; ALeft, ATop :Integer);
 public
 published
   procedure SetProperty(key, value: String);
   procedure UpdateDataEditor;
 end;

var
 Form1: TForm1;
 Selected: TObject;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
createIMG ('Image_'+inttostr(Page.ControlCount), 150, 150, True);
end;
procedure TForm1.ImgMouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
var
P: TPoint;
begin
if ssLeft in Shift then
begin
  GetCursorPos (P);
  P := Page.ScreenToClient ( Point(P.X-(Sender as TImage).UndockHeight,
                                   P.Y-(Sender as TImage).UndockWidth));
 (Sender as TImage).Left := P.X;
 (Sender as TImage).Top := P.Y;
end;
end;

procedure TForm1.ImgMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin
(Sender as TImage).UndockHeight := X;
(Sender as TImage).UndockWidth := Y;
end;

procedure TForm1.TxtMouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
var
P: TPoint;
begin
if ssLeft in Shift then
begin
  GetCursorPos (P);
  P := Page.ScreenToClient ( Point(P.X-(Sender as TLabel).UndockHeight,
                                   P.Y-(Sender as TLabel).UndockWidth));
 (Sender as TLabel).Left := P.X;
 (Sender as TLabel).Top := P.Y;
end;
end;

procedure TForm1.TxtMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin
(Sender as TLabel).UndockHeight:=X;
(Sender as TLabel).UndockWidth:=Y;
end;

procedure TForm1.ObjectSelect(Sender: TObject);
begin
Selected := Sender;
DataEditor.Items.Clear;
if Assigned (Selected) then
    TCustomControl(Sender).BringToFront;
UpdateDataEditor;
end;

procedure TForm1.PageClick(Sender: TObject);
begin
ObjectSelect (nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DataEditor.Items.NameValueSeparator := ':';
end;

procedure TForm1.DataEditorDblClick(Sender: TObject);
var
key, newP, P:String;
begin
P := DataEditor.Items.ValueFromIndex [DataEditor.ItemIndex];
key := DataEditor.Items.Names[DataEditor.ItemIndex];
newP := P;
InputQuery('Изменение параметров','Введите новое значение',newP);
if P <> newP then SetProperty (key,newP);
end;

procedure TForm1.SetProperty(key, value: String);
begin
if Selected.ClassName='TImage' then
begin
 if key = 'Name ' then
      (Selected as TImage).Name := value;
 if key = 'Top ' then
      (Selected as TImage).Top := strtoint(value);
 if key = 'Left ' then
      (Selected as TImage).Left := strtoint(value);
 if key = 'Proportional ' then
      (Selected as TImage).Proportional := (UpperCase(value)='TRUE');
end;
if Selected.ClassName='TLabel' then
begin
 if key = 'Name ' then
      (Selected as TLabel).Name := value;
 if key = 'Top ' then
      (Selected as TLabel).Top := strtoint(value);
 if key = 'Left ' then
      (Selected as TLabel).Left := strtoint(value);
 if key = 'Text ' then
      (Selected as TLabel).Caption := value;
end;
UpdateDataEditor;
end;

procedure TForm1.UpdateDataEditor;
begin
if Not Assigned (Selected) then exit;
if Selected.ClassName = 'TImage' then
begin
 DataEditor.Items.Values['Name '] := (Selected  as TImage).Name;
 DataEditor.Items.Values['Top '] := inttostr((Selected  as TImage).Top);
 DataEditor.Items.Values['Left '] := inttostr((Selected  as TImage).Left);
 if (Selected as TImage).Proportional
     then  DataEditor.Items.Values['Proportional '] := 'True'
     else  DataEditor.Items.Values['Proportional ']:='False';
end;

if Selected.ClassName='TLabel' then
begin
 DataEditor.Items.Values['Name '] := (Selected  as TLabel).Name;
 DataEditor.Items.Values['Top '] := inttostr((Selected  as TLabel).Top);
 DataEditor.Items.Values['Left '] := inttostr((Selected  as TLabel).Left);
 DataEditor.Items.Values['Text '] := (Selected as TLabel).Caption;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
createTxt ('Component_'+inttostr(Page.ControlCount), 'Мой текст', 10, 10);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
x: Integer;
F: TextFile;
begin
AssignFile (F, 'myfile.myFORMAT'); ReWrite (F);
for x := 0 to Page.ControlCount-1 do
begin
 if Page.Controls[x].ClassName = 'TImage' then
  begin
   Writeln(F, 'IMAGE');
   Writeln(F, (Page.Controls[x] as TImage).Name);
   Writeln(F, (Page.Controls[x] as TImage).Left);
   Writeln(F, (Page.Controls[x] as TImage).Top);
   Writeln(F, Byte((Page.Controls[x] as TImage).Proportional));
  end;
 if Page.Controls[x].ClassName = 'TLabel' then
  begin
   Writeln(F, 'TEXT');
   Writeln(F, (Page.Controls[x] as TLabel).Name);
   Writeln(F, (Page.Controls[x] as TLabel).caption);
   Writeln(F, (Page.Controls[x] as TLabel).Left);
   Writeln(F, (Page.Controls[x] as TLabel).Top);
  end;
end;
CloseFile(F);
end;

procedure TForm1.createImg(AName: String; ALeft, ATop: Integer;  Prop: Boolean);
var
I: TIMage;
dr: PChar;
begin
I := TImage.Create (Page);
GetMem (dr, 144);
GetWindowsDirectory (dr, 144);
I.Picture.LoadFromFile (String(dr) + '\Пузыри.bmp');
FreeMem (dr);
I.Parent := Page;
I.Top := ATop;
I.Left := ALeft;
I.Proportional := Prop;
I.Name := AName;
I.OnMouseMove := ImgMouseMove;
I.OnMouseDown := ImgMouseDown;
I.OnClick := objectSelect;
end;

procedure TForm1.createTxt(AName, AText: String; ALeft, ATop: Integer);
var
I: TLabel;
begin
I := TLabel.Create (Page);
I.Parent := Page;
I.Name := AName;
I.Caption := AText;
I.Top := ATop;
I.Left := ALeft;
I.OnMouseMove := TxtMouseMove;
I.OnMouseDown := TxtMouseDown;
I.OnClick := objectSelect;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
F: TextFile;
p1,p2,p3,p4,s: String;
begin
AssignFile (F,'myfile.myFORMAT'); Reset (F);
while not eof(F) do
begin
  ReadLn (F,s); ReadLn (F,p1); ReadLn (F,p2);
  ReadLn (F,p3); ReadLn (F,p4);
 if S='IMAGE' then createImg (p1, strtoint(p2), strtoint(p3), (p4 = '1'));
 if S='TEXT' then createTxt (p1, p2, strtoint(p3), strtoint (p4));
end;
CloseFile(F);
end;

end.

myEditor.dfm
Код

object Form1: TForm1
 Left = 174
 Top = 166
 BorderStyle = bsDialog
 Caption = 'Form1'
 ClientHeight = 271
 ClientWidth = 564
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 FormStyle = fsNormal
 KeyPreview = True
 OldCreateOrder = False
 Position = poScreenCenter
 Visible = True
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object Page: TScrollBox
   Left = 160
   Top = 0
   Width = 404
   Height = 271
   Align = alRight
   TabOrder = 0
   OnClick = PageClick
 end
 object Button3: TButton
   Left = 78
   Top = 242
   Width = 75
   Height = 25
   Caption = 'Загрузить'
   TabOrder = 1
   OnClick = Button3Click
 end
 object Button2: TButton
   Left = 2
   Top = 242
   Width = 75
   Height = 25
   Caption = 'Сохранить'
   TabOrder = 2
   OnClick = Button2Click
 end
 object DataEditor: TListBox
   Left = 4
   Top = 28
   Width = 149
   Height = 213
   BevelKind = bkFlat
   BorderStyle = bsNone
   ItemHeight = 13
   TabOrder = 3
   OnDblClick = DataEditorDblClick
 end
 object BitBtn1: TBitBtn
   Left = 2
   Top = 2
   Width = 75
   Height = 25
   Caption = 'Картинка'
   TabOrder = 4
   OnClick = BitBtn1Click
 end
 object Button1: TButton
   Left = 80
   Top = 2
   Width = 75
   Height = 25
   Caption = 'Текст'
   TabOrder = 5
   OnClick = Button1Click
 end
end

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)