home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
pas
/
ktools
/
source
/
otedit.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-11-11
|
9KB
|
368 lines
Unit OTEdit;
{ Editeur réalisé à partir d'un tableau de pointeurs sur des chaines
de caractères. Il s'agit d'un objet dérivé de l'objet TStrTab défini
dans l'unité OStrTab.Pas. }
{ Cet objet ne gère pas directement l'affichage, mais il tient à jour
les paramètres nécessaires à l'affichage. }
{ Voir le programme MiniEdit.Pas pour un exemple d'utilisation. }
{ KB avril-mai 1994 }
{$IFDEF debug}
{$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
{$ELSE}
{$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
{$ENDIF}
INTERFACE
Uses Dos, OTableau;
Type PEdObj=^TEdObj;
TEdObj=object(TStrTab)
InsertStatus: Boolean; { bascule Insertion/Remplacement }
TextChanged : Boolean; { indicateur de changements }
WorkLine, { ligne courante dans le texte }
WorkColumn, { colonne courante dans le texte }
NrScreenLine, { ligne courante à l'écran }
NrScreenColumn, { colonne courante à l'écran }
FirstScreenLine, { 1ère ligne affichée }
FirstTextCol, { 1ère colonne affichée }
NbLines, { nombre de lignes affichées }
NbCols: Integer; { nombre de colonnes affichées }
FileName:PathStr; { nom du fichier texte }
Constructor Init(NbL,NbC:Integer);
{ Le constructeur demande 2 paramètres : le nombre de lignes et
le nombre de colonnes à afficher. }
Constructor Load(NbL,NbC:Integer;F:PathStr);
{ Constructeur permettant de charger un fichier texte. }
Procedure CharLeft; { Déplacement d'un caractère à gauche }
Procedure CharRight; { Déplacement d'un caractère à droite }
Procedure StartLine; { Début de ligne }
Procedure EndLine; { Fin de ligne }
Procedure CharUp; { Déplacement d'un caractère vers le haut }
Procedure CharDown; { Déplacement d'un caractère vers le bas }
Procedure PageUp; { Déplacement d'une page vers le haut }
Procedure PageDown; { Déplacement d'une page vers le bas }
Procedure StartText; { Début du texte }
Procedure EndText; { Fin du texte }
Procedure ChangeInsertMode; { Bascule mode d'insertion }
Procedure DelChar; { Supprime le caractère courant }
Procedure DelPrevChar; { Supprime le caractère précédent }
Procedure CharTab; { Tabulation }
Procedure NewLine; { Retour à la ligne }
Procedure DelLine; { Supprime la ligne courante }
Procedure InsertChar(Car: char); { Insère un caractère }
Procedure NewPos(x,y:Integer); { Fixe la nouvelle position du curseur }
Function FindString(FS:String;DebLine:Integer):Boolean;
{ recherche d'une chaine }
Procedure SaveText(F:PathStr); { sauvegarde sur fichier }
End;
IMPLEMENTATION
Procedure DelSpace (var Str: string );
{ suppression des espaces en fin de chaine }
Begin
while Str[length(Str)]=#32 do dec(Str[0]);
End;
{ Objet TEdObj }
Constructor TEdObj.Init(NbL,NbC:Integer);
Var Str: String;
fini: Boolean;
Begin
{ constructeur hérité }
TStrTab.Init(20,20);
{ initialisation des variables }
TextChanged:=false;
WorkLine:=1; { numéro ligne courante }
WorkColumn:=1; { numéro colonne courante }
NrScreenLine:=1; { numéro ligne écran }
NrScreenColumn:=1; { numéro colonne écran }
FirstTextCol:=1; { numéro 1ère colonne affichée }
FirstScreenLine:=1; { numéro 1ère ligne affichée }
NbLines:=NbL; { nombre de lignes affichées }
NbCols:=NbC; { nombre de colonnes affichées }
FileName:='sansnom'; { nom du fichier }
{ initialisation de la première ligne }
AjouterLigne(''); { 1ère ligne vide }
End;
Constructor TEdObj.Load(NbL,NbC:Integer;F:PathStr);
Begin
{ constructeur hérité }
TStrTab.Load(F);
if IsValid
then FileName:=F
else FileName:='sansnom';
TextChanged:=false;
WorkLine:=1;
WorkColumn:=1;
NrScreenLine:=1;
NrScreenColumn:=1;
FirstTextCol:=1;
FirstScreenLine:=1;
NbLines:=NbL;
NbCols:=NbC;
if NombreItems=0
then AjouterLigne('');
End;
Procedure TEdObj.CharLeft;
Begin
if WorkColumn=1
then begin
if WorkLine>1
then begin
CharUp;
StartLine;
EndLine;
end;
end
else begin
if NrScreenColumn>1
then dec(NrScreenColumn)
else dec(FirstTextCol);
dec(WorkColumn);
end;
End;
Procedure TEdObj.CharRight;
Begin
if WorkColumn=255 then exit;
inc(WorkColumn);
if NrScreenColumn<NbCols
then inc(NrScreenColumn)
else inc(FirstTextCol);
End;
Procedure TEdObj.StartLine;
Begin
WorkColumn:=1;
NrScreenColumn:=1;
FirstTextCol:=1;
End;
Procedure TEdObj.EndLine;
Var i:Byte;
Str:String;
Begin
Str:=Ligne(WorkLine);
DelSpace(Str);
StartLine;
if Str<>''
then begin
while WorkColumn<length(Str) do CharRight;
CharRight;
end;
End;
Procedure TEdObj.NewPos(x,y:Integer);
Begin
if x<1 then x:=1;
if x>NbCols then x:=NbCols;
while x<NrScreenColumn do CharLeft;
while x>NrScreenColumn do CharRight;
if y<1 then y:=1;
if y>NbLines then y:=NbLines;
while (y<NrScreenLine) do CharUp;
while (y>NrScreenLine) and (WorkLine<>NombreItems) do CharDown;
End;
Procedure TEdObj.CharUp;
Begin
if WorkLine=1
then exit;
dec(WorkLine);
if NrScreenLine>1
then dec(NrScreenLine)
else FirstScreenLine:=WorkLine;
End;
Procedure TEdObj.CharDown;
Begin
if WorkLine=NombreItems
then exit;
inc(WorkLine);
if NrScreenLine<NbLines
then inc(NrScreenLine)
else inc(FirstScreenLine);
End;
Procedure TEdObj.PageUp;
Var i:Byte;
Begin
for i:=1 to NbLines-1 do CharUp;
End;
Procedure TEdObj.PageDown;
Var i:Byte;
Begin
for i:=1 to NbLines-1 do CharDown;
End;
Procedure TEdObj.StartText;
Begin
WorkLine:=1;
WorkColumn:=1;
NrScreenLine:=1;
NrScreenColumn:=1;
FirstTextCol:=1;
FirstScreenLine:=1;
End;
Procedure TEdObj.EndText;
Begin
while WorkLine<>NombreItems do CharDown;
EndLine;
End;
Procedure TEdObj.ChangeInsertMode;
Begin
InsertStatus:=not InsertStatus;
End;
Procedure TEdObj.DelChar;
Var Str:String;
Begin
Str:=Ligne(WorkLine);
if Str=''
then DelLine
else begin
Delete(Str,WorkColumn,1);
ChangerLigne(WorkLine,Str);
end;
TextChanged:=true;
End;
Procedure TEdObj.DelPrevChar;
Var PrevLine:Integer;
Col: Word;
Str1, Str2: String;
Begin
if WorkColumn=1
then begin
if WorkLine=1 then exit;
PrevLine:=WorkLine-1;
Str1:=Ligne(PrevLine);
Str2:=Ligne(WorkLine);
DelSpace(Str1);
DelSpace(Str2);
if length(Str1)+length(Str2)>255 then exit;
Col:=length(Str1);
ChangerLigne(PrevLine,Str1+Str2);
DelLine;
CharUp;
StartLine;
while WorkColumn<=Col do CharRight;
end
else begin
CharLeft;
DelChar;
end;
TextChanged:=true;
End;
Procedure TEdObj.CharTab;
Var i:Byte;
Begin
for i:=1 to 5 do InsertChar(#32);
End;
Procedure TEdObj.NewLine;
Var Str, Str1, Str2: String;
Begin
Str:=Ligne(WorkLine);
Str1:=copy(Str,1,WorkColumn-1);
DelSpace(Str1);
Str2:=copy(Str,WorkColumn,255);
DelSpace(Str2);
ChangerLigne(WorkLine,Str1);
PlacerLigne(Str2,WorkLine+1);
TextChanged:=true;
StartLine;
CharDown;
End;
Procedure TEdObj.DelLine;
Begin
if WorkLine<>NombreItems
then Eliminer(WorkLine)
else ChangerLigne(WorkLine,'');
StartLine;
TextChanged:=true;
End;
Procedure TEdObj.InsertChar (Car: char);
Var Str:String;
Begin
Str:=Ligne(WorkLine);
while length(Str)<WorkColumn do Str:=Str+#32;
if not InsertStatus
then Str[WorkColumn]:=Car
else Insert(Car,Str,WorkColumn);
ChangerLigne(WorkLine,Str);
CharRight;
TextChanged:=true;
End;
Function TEdObj.FindString(FS:String;DebLine:Integer):Boolean;
Var ALine:Integer;
S:String;
i,p:Word;
ok:Boolean;
Begin
ALine:=DebLine;
if (ALine<1) or (ALine>NombreItems)
then begin
FindString:=false;
exit;
end;
ok:=false;
repeat
S:=Ligne(ALine);
p:=Pos(FS,S);
if p<>0
then begin
ok:=true;
FirstScreenLine:=ALine;
NrScreenLine:=1;
WorkLine:=ALine;
StartLine;
For i:=1 to p do CharRight;
CharLeft;
end
else inc(ALine);
until ok or (ALine>NombreItems);
FindString:=ok;
End;
Procedure TEdObj.SaveText(F:PathStr);
Var ATextFile: text;
ALine: Integer;
Str: string;
Begin
Assign (ATextFile, F);
{$I-}
Rewrite (ATextFile);
{$I+}
If IOResult<>0
then exit;
ALine:=1;
while ALine<=NombreItems do
begin
Str:=Ligne(ALine);
DelSpace(Str);
WriteLn(ATextFile,Str);
inc(ALine);
end;
Close(ATextFile);
TextChanged:=false;
FileName:=F;
End;
END.
{ Fin du fichier OTEdit.pas }