//打开文件
procedure TForm1.BtnOpenClick(Sender: TObject);
var
S: TStream;
i: Integer;
Map: TImage;
Panel: TPanel;
tmpStrList: TStrings;
tmpStr, tmpLeft, tmpTop, tmpWidth, tmpHeight, tmpFileName: String;
begin
for i := 0 to RichEditNew.ControlCount - 1 do
begin
RichEditNew.Controls[0].Free;
end;
if OpenDialog1.Execute then
begin
tmpFileName := OpenDialog1.FileName;
tmpStrList := TStringList.Create;
S := TFileStream.Create(tmpFileName, fmOpenRead);
S.ReadComponent(RichEditNew);
tmpStrList.LoadFromFile(ExtractFilePath(tmpFileName) + ExtractFileName(tmpFileName)+'.info');
for i := 0 to tmpStrList.Count - 1 do
try
tmpStr := tmpStrList.Strings[i];
tmpLeft := ListValue(tmpStr, 2);
tmpTop := ListValue(tmpStr, 3);
tmpWidth := ListValue(tmpStr, 4);
tmpHeight := ListValue(tmpStr, 5);
//保存文件
procedure TForm1.BtnSaveClick(Sender: TObject);
var
S: TStream;
i: Integer;
tmpStrList: TStrings;
tmpFileName: String;
begin
if SaveDialog1.Execute then
begin
tmpFileName := SaveDialog1.FileName;
// 保存元件到文件
tmpStrList := TStringList.Create;
S := TFileStream.Create(tmpFileName, fmCreate);
try
S.WriteComponent(RichEditNew);
for i := 0 to RichEditNew.ControlCount - 1 do
begin
if RichEditNew.Controls[i] is TPanel then
begin
S.WriteComponent(TPanel(RichEditNew.Controls[i]));
if TPanel(RichEditNew.Controls[i]).Controls[0] is TImage then
begin
S.WriteComponent(TImage(TPanel(RichEditNew.Controls[i]).Controls[0]));
tmpStrList.Add('myPanel'+IntToStr(i + 1)+','+'myImage'+IntToStr(i + 1)+','
+IntToStr(TPanel(RichEditNew.Controls[i]).Left)+','
+IntToStr(TPanel(RichEditNew.Controls[i]).Top)+','
+IntToStr(TPanel(RichEditNew.Controls[i]).Width)+','
+IntToStr(TPanel(RichEditNew.Controls[i]).Height));
end;
end;
end;
tmpStrList.SaveToFile(ExtractFilePath(tmpFileName) + ExtractFileName(tmpFileName)+'.info');
finally
S.Free;
tmpStrList.Free;
end;
end;
end;
为了配合一叶知秋的程序,所以此例用了Panel做为Image的载体,一起存取。
因为还要把位置存取下来,所以我用了一个信息文件(.info)来存文件所包括的所有图片的宽、高、左、顶的信息。可对打开文件的所有图片再次进行缩放再次存取。调试通过^^
在此,再次感谢maozefa(之源)的引导^^
unit Unit1;
{$R *.dfm}
procedure ManipulateControl(WinControl: TControl; Shift: TShiftState;
X, Y, Precision: integer);
//Precision:精度,该方法可以在onmousemove中调用
var
SC_MANIPULATE: Word;
begin
//光标在控件的最左侧
if (X<=Precision) and (Y>Precision) and (Y<WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F001;
WinControl.Cursor := crSizeWE;
end
else
//光标在控件的最右侧
if (X>=WinControl.Width-Precision) and (Y>Precision) and (Y<WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F002;
WinControl.Cursor := crSizeWE;
end
else
//光标在控件的最上侧
if (X>Precision) and (X<WinControl.Width-Precision) and (Y<=Precision) then
begin
SC_MANIPULATE := $F003;
WinControl.Cursor := crSizeNS;
end
else
//光标在控件的最下侧
if (X>Precision) and (X<WinControl.Width-Precision) and (Y>=WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F006;
WinControl.Cursor := crSizeNS;
end
else
//光标在控件的左上角
if (X<=Precision) and (Y<=Precision) then
begin
SC_MANIPULATE := $F004;
WinControl.Cursor := crSizeNWSE;
end
else
//光标在控件的右上角
if (X>=WinControl.Width-Precision) and (Y<=Precision) then
begin
SC_MANIPULATE := $F005;
WinControl.Cursor := crSizeNESW ;
end
else
//光标在控件的左下角
if (X<=Precision) and (Y>=WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F007;
WinControl.Cursor := crSizeNESW;
end
else
//光标在控件的右下角
if (X>=WinControl.Width-Precision) and (Y>=WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F008;
WinControl.Cursor := crSizeNWSE;
end
else
//光标在控件的客户区(移动整个控件)
if (X>5) and (Y>5) and (X<WinControl.Width-5) and
(Y<WinControl.Height-5) then
begin
SC_MANIPULATE := $F009;
WinControl.Cursor := crSizeAll;
end
else
begin
SC_MANIPULATE := $F000;
WinControl.Cursor := crDefault;
end;
if Shift=[ssLeft] then
begin
ReleaseCapture;
WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
end;
end;
function StrLeft(const mStr: string; mDelimiter: string): string;
{ 返回左分隔字符串 }
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end;
function ListValue(mList: string; mIndex: Integer; mDelimiter: string = ','): string;
{ 返回列表指定位置的元素 }
var
I, L, K: Integer;
begin
if Pchar(mList)[Length(mList)-1] <> mDelimiter then
mList:=mList + mDelimiter;
L := Length(mList);
I := Pos(mDelimiter, mList);
K := 0;
Result := '';
while (I > 0) and (K <> mIndex) do begin
mList := Copy(mList, I + Length(mDelimiter), L);
I := Pos(mDelimiter, mList);
Inc(K);
end;
if K = mIndex then
Result := StrLeft(mList + mDelimiter, mDelimiter);
end;
继续请教楼上各位高手:
我想保存的是TImage控件和其上的图片,写入一个文件
我改写了上面的过程(我没有做过这方面,请指教!):
procedure TMainForm.Savecontrols(const FileName:string;const Controls:array of TImage);
var
fs:TFilestream;
writer:TWriter;
i:Integer;
begin
fs:=TFilestream.Create(FileName,fmCreate);
try
writer:=TWriter.Create(fs,4096);
try
for i:=0 to 99 do
with TImage(Controls[i]) do
begin
writer.WriteComponent(Controls[i]);//这里该怎么写?请教!
end;
finally
writer.Free;
end;
finally
fs.Free;
end;
end;
我想把TImage控件和图片(TPicture)分别保存为两个控件数组,然后写入一个文件,
这样可行吗?关键是打开文件时还应该能读出控件和图片,并在TImage上显示相应的图片
有高手回答出这个问题,我给他另立散分贴,请教啦!!!
万分感谢!!!