Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

Помогите разобраться с компонентами   Найти похожие ветки 

 
Maloric   (2006-03-02 20:37) [0]

Добрый вечер!
Никак не могу понять как сделать компонент.
У меня есть визуальный компонент от предка TMemo,
как сделать такой же для Kol и Mck. Может я наконец разбирусь как их создавать.

interface
uses  Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
 TFileMemo = class(TMemo)
 private
   FFileName: string;
   FCrypt: boolean;
   procedure Shifr(var s: string);
   procedure DeShifr(var s: string);
 protected
 public
       procedure Load;
       procedure Save;
 published
       constructor Create(aOwner:TComponent); override;
       property FileName:string read FFileName write FFileName;
       property Crypt:boolean read FCrypt write FCrypt;
 end;
procedure Register;
implementation
procedure Register;
begin
 RegisterComponents("Maloric", [TFileMemo]);
end;
constructor TFileMemo.Create(aOwner:TComponent);
begin
    inherited create(Aowner);
end;
procedure TFileMemo.Shifr(var s:string);
begin
{процедура шифровния}
end;
procedure TFileMemo.DeShifr(var s:string);
{процедура расшифровки}
end;
procedure TFileMemo.Load;
var f1:System.text;
    s:string;
begin
    if FFileName<>"" then begin
    Lines.Clear;
    WordWrap:=false;
    AssignFile(f1,FFileName);
    ReSet(f1);
    while not eof(f1) do begin
                  ReadLn(f1,s);
                  DeShifr(s);
                  Lines.Add(s);
                  end;
    CloseFile(f1);
    end;
end;
procedure TFileMemo.Save;
var f1:System.text;
   s:string;
   i:integer;
begin
    if FFileName<>"" then begin
    AssignFile(f1,FFileName);
    Rewrite(f1);
    for i:=0 to Lines.Count-1 do begin
      s:=Lines[i];
      Shifr(s);
      WriteLn(f1,s);
    end;
    CloseFile(f1);
    end;
end;
end.



 
ecm ©   (2006-03-02 22:28) [1]

Читаем, разбираемся, применяем полученные знания:
http://bonanzas.rinet.ru/art003.htm
http://bonanzas.rinet.ru/WritingComp.htm
http://www.kolnmck.ru/lessons/createcomp1.shtml
и скоро должно(или уже?) появится в книге
http://bonanzas.rinet.ru/KOLBook.rar
:))


 
ECM ©   (2006-03-02 23:05) [2]

з.ы.
ИМХО для этого случая - я бы не создавал наследника Memo. Лучше взять стандартный, а для чтения-записи (шифровки-дешифровки) создал бы специальный CryptFileStream при помощи _NewStream , где и определил процедуры (StreamMethods) для шифрованного доступа


 
z007   (2006-03-03 00:09) [3]

Какой вопрос - такой ответ:


unit KOL_CryptMem;

//KOL Control CopyLeft (c)2006 z007

interface
uses kol;

type

   PCryptMemo=^TCryptMemo;
   TKOLCryptMemo = PCryptMemo;
   TCryptMemo = object (TControl)
   public
   function Load(aFileName: string; doCrypt: boolean): boolean;
   function Save(aFileName: string; doCrypt: boolean): boolean;
   end;
implementation

function TCryptMemo.Load(aFileName: string; doCrypt: boolean): boolean;
var S : String;
   i : integer;
begin
   {Sample :)}
   Result:=False;
   if not doCrypt then exit;
   S:=StrLoadFromFile(aFileName);
   for i:=1 to Length(S) do
       if not (ord(S[i]) in [0, 1, 13, 14,  10,  11,  255]) then
           S[i]:=Chr(Ord(S[i]) - 1);
   Text:=S;
   Result:=True;
end;

function TCryptMemo.Save(aFileName: string; doCrypt: boolean): boolean;
var S : String;
   i : integer;
begin
   {Sample :)}
   Result:=False;
   if not doCrypt then exit;
   S:=Text;
   for i:=1 to Length(S) do
       if not (ord(S[i]) in [0, 13, 12,  10,  9,  254, 255]) then
           S[i]:=Chr(Ord(S[i]) + 1);
   StrSaveToFile(aFileName, S);
   Result:=True;
end;

end.

unit mckCryptMemo;
//MCK Mirror Control CopyLeft (c)2006 z007
interface
uses kol, mckCtrls, KOL_CryptMem, mckObjs, mirror,  Classes;
type
 TKOLCryptMemo = class(TKOLMemo)
 protected
   function AdditionalUnits: string;override;
   procedure SetupFirst(SL: TStringList; const AName, AParent, Prefix: String); override;
   procedure SetupConstruct(SL: TStringList; const AName, AParent,
     Prefix: String); override;
 end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents("Maloric", [TKOLCryptMemo]);
end;

function TKOLCryptMemo.AdditionalUnits: string;
begin
   result := inherited AdditionalUnits + ", KOL_CryptMem"
end;

procedure TKOLCryptMemo.SetupConstruct(SL: TStringList; const AName,
 AParent, Prefix: String);
var S: String;
begin
{
 asm
   jmp @@e_signature
   DB "#$signature$#", 0
   DB "TKOLCustomControl.SetupConstruct", 0
 @@e_signature:
 end;
}
 S := GenerateTransparentInits;
 SL.Add( Prefix + AName + " := PCryptMemo( New" + TypeName + "( "
         + SetupParams( AName, AParent ) + " )" + S + ");" );

end;

procedure TKOLCryptMemo.SetupFirst;
begin
inherited;
end;

end.

Unit1
<...>
const fn="c:\kol\dem~o\mm.txt";

procedure TForm1.ButtonSave(Sender: PObj);
begin
cm.Save(fn, true);
end;

procedure TForm1.ButtonLoad(Sender: PObj);
begin
if fileexists(fn) then
cm.Load(fn, true);
end;
<...>


 
z007   (2006-03-03 00:10) [4]

2 ECM:
А не приведет ли создание для этого CryptFileStream к излишнему увеличению кода?


 
Владимир Кладов   (2006-03-03 06:34) [5]

Может и приведет. Создание наследника обычно приводит к добавлению в код программы еще одного экземпляра vmt. Кажется, даже в случае, если нет новых виртуальных методов. Хотя в этом случае я могу ошибаться, и еще это может зависеть от версии Delphi. В любом случае дешевле добавить пару глобальных функций, а не методов. Какой прок в создании целого объектного типа или класса? Если кроме этих двух новых методов ничего не добавляется. Зато при наличии глобадбных функций у вас появится возможность использовать их и для rich edit, и для какого-либо гораздо более богатого потенциального наследника edit/memo/rich, если он кем-то будет сделан.


 
Maloric   (2006-03-03 11:14) [6]

z007
Интересный пример, спасибо.
Но вот только, ошибка при установке, компонента z007
[Error] Never-build package "CryptMemoD6" requires always-build package "MirrorKOLPackageD6"


 
ECM ©   (2006-03-03 11:25) [7]

Откройте пакет MirrorKOLPackageD6, в опциях проекта установите "Explicit rebuild" и пересоберите его...


 
Maloric   (2006-03-03 11:27) [8]

Извините, проблему нашел, изменил опции компилятора как написанно в Faq-е.

И все таки

> http://bonanzas.rinet.ru/WritingComp.htm
> http://www.kolnmck.ru/lessons/createcomp1.shtml

не очень понятно изложенно все. Надо хотя бы добавить простейший пример, а то я написал компонент у меня текста вышло в два раза больше чем у z007, и не работает.
Спасибо.


 
ECM ©   (2006-03-03 11:50) [9]


> не очень понятно изложенно все. Надо хотя бы добавить простейший
> пример

Возьметесь за написание простого примера и ясной и понятной статьи к нему?
С удовольствием помещу её на kolnmck.ru :))


 
z007   (2006-03-04 19:34) [10]

Возьмусь. Какой объем? Куда слать?


 
MTsv DN ©   (2006-03-04 20:02) [11]

Привет...

[i]> Возьмусь. Какой объем? Куда слать?[/i]
ECM или мне...
Объем, думаю, любой... Самое главное, чтобы было понятно, просто и "без воды"...

С Уважением MTsv DN



Страницы: 1 вся ветка

Текущий архив: 2006.12.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
2-1164702335
Joq
2006-11-28 11:25
2006.12.17
Написание службы


2-1164719095
Феникс
2006-11-28 16:04
2006.12.17
Не могу разобраться с ExtractFilePath(Application.ExeName)


2-1164253828
Andrey__
2006-11-23 06:50
2006.12.17
Помогите решить задачу плиз.


15-1164598028
Slider007
2006-11-27 06:27
2006.12.17
С днем рождения ! 25 ноября


2-1164709195
alex810
2006-11-28 13:19
2006.12.17
Компонент Query