📄 unitresourcedetails.pas
字号:
| Change all the data. Handy for implementing 'undo', etc. |
*----------------------------------------------------------------------*)
procedure TResourceDetails.ChangeData(newData: TMemoryStream);
begin
fData.Clear;
fData.CopyFrom (newData, 0);
end;
(*----------------------------------------------------------------------*
| TResourceDetails.Create |
| |
| Raw - protected - constructor for resource details. |
*----------------------------------------------------------------------*)
constructor TResourceDetails.Create(AParent: TResourceModule; ALanguage: Integer; const AName, AType: string; ASize: Integer;
AData: pointer);
begin
fParent := AParent;
fResourceLanguage := ALanguage;
fResourceName := AName;
fResourceType := AType;
fData := TMemoryStream.Create;
fData.Write (AData^, ASize)
end;
(*----------------------------------------------------------------------*
| TResourceDetails.CreateNew |
| |
| Constructor to be used when adding new resources to a module. |
*----------------------------------------------------------------------*)
constructor TResourceDetails.CreateNew(AParent: TResourceModule;
ALanguage: Integer; const aName : string);
begin
fParent := AParent;
fResourceLanguage := ALanguage;
fResourceName := AName;
fResourceType := GetBaseType;
if Assigned (AParent) then
AParent.AddResource (Self);
fData := TMemoryStream.Create;
InitNew
end;
(*----------------------------------------------------------------------*
| TResourceDetails.CreateResourceDetails |
| |
| Create a class derived from TResourceDetals that reflects the 'Type' |
| If no matching class is registered, create a base 'TResourceDetails' |
| class. (Ha! Try doing *that* in C++ ! ) |
*----------------------------------------------------------------------*)
class function TResourceDetails.CreateResourceDetails(
AParent: TResourceModule; ALanguage: Integer; const AName,
AType: string; ASize: Integer; AData: pointer): TResourceDetails;
var
i : Integer;
begin
result := Nil;
if (Length (AType) > 0) and (AType [1] in ['0'..'9']) then
try
for i := 0 to registeredResourceDetailsCount - 1 do
if registeredResourceDetails [i].GetBaseType = AType then
begin
if (AType <> IntToStr (Integer (RT_RCDATA))) or registeredResourceDetails [i].SupportsRCData (AName, ASize, AData) then
begin
result := registeredResourceDetails [i].Create (AParent, ALanguage, AName, AType, ASize, AData);
break
end
end;
except
end;
if Result = nil then
try
for i := 0 to registeredResourceDetailsCount - 1 do
if registeredResourceDetails [i].SupportsData (ASize, AData) then
begin
result := registeredResourceDetails [i].Create (AParent, ALanguage, AName, AType, ASize, AData);
break
end;
except
end;
if result = Nil then
result := TResourceDetails.Create (AParent, ALanguage, AName, AType, ASize, AData)
end;
(*----------------------------------------------------------------------*
| TResourceDetails.Destroy |
*----------------------------------------------------------------------*)
destructor TResourceDetails.Destroy;
begin
fData.Free;
inherited;
end;
(*----------------------------------------------------------------------*
| TResourceDetails.GetBaseType |
| |
| Return the base type for the resource details. This is overridden |
| in derived classes. |
*----------------------------------------------------------------------*)
class function TResourceDetails.GetBaseType: string;
begin
Result := '0';
end;
(*----------------------------------------------------------------------*
| TResourceDetails.InitNew |
| |
| Override this to initialize a new resource being added to a module. |
*----------------------------------------------------------------------*)
procedure TResourceDetails.InitNew;
begin
// Stub
end;
(*----------------------------------------------------------------------*
| TResourceDetails.SetResourceName |
| |
| Set the resource name. |
*----------------------------------------------------------------------*)
procedure TResourceDetails.SetResourceName(const Value: string);
begin
fResourceName := Value;
fDirty := True
end;
{ TResourceModule }
(*----------------------------------------------------------------------*
| TResourceModule.LoadFromFile |
| |
| Load from file. This can be overriden but usually isn't as it |
| relies on LoadFromStream, which must be. |
*----------------------------------------------------------------------*)
function TResourceModule.AddResource(details: TResourceDetails): Integer;
begin
result := -1
// Stub
end;
procedure TResourceModule.ClearDirty;
var
i : Integer;
begin
fDirty := False;
for i := 0 to ResourceCount - 1 do
ResourceDetails [i].Dirty := False
end;
(*----------------------------------------------------------------------*
| TResourceModule.DeleteResource |
| |
| Must be overridden to remove the resource details object from |
| wherever it's stored. The overriding method must call |
| inherited |
*----------------------------------------------------------------------*)
procedure TResourceModule.DeleteResource(idx: Integer);
begin
fDirty := True;
ResourceDetails [idx].BeforeDelete;
end;
(*----------------------------------------------------------------------*
| TResourceModule.FindResource |
| |
| Find a resource with a given type/name |
*----------------------------------------------------------------------*)
function TResourceModule.FindResource(const tp,
Name: string; ALanguage : Integer): TResourceDetails;
var
i : Integer;
begin
Result := nil;
for i := 0 to ResourceCount - 1 do
if (ResourceDetails [i].fResourceType = tp) and (ResourceDetails [i].fResourceName = Name) and (Integer (ResourceDetails [i].fResourceLanguage) = ALanguage) then
begin
Result := ResourceDetails [i];
break
end;
if not Assigned (result) then
for i := 0 to ResourceCount - 1 do
if (ResourceDetails [i].fResourceType = tp) and (ResourceDetails [i].fResourceName = Name) and (ResourceDetails [i].fResourceLanguage = 0) then
begin
Result := ResourceDetails [i];
break
end
end;
(*----------------------------------------------------------------------*
| TResourceModule.GetDirty |
| |
| Returns true if the module or it's resources are 'dirty' |
| |
| nb. fDirty is only set if resources have been deleted. |
| After adding a resource make sure the resource's Dirty is set to |
| true. |
*----------------------------------------------------------------------*)
function TResourceModule.GetDirty: Boolean;
var
i : Integer;
begin
Result := fDirty;
if not fDirty then
for i := 0 to ResourceCount - 1 do
if ResourceDetails [i].Dirty then
begin
Result := True;
break
end
end;
(*----------------------------------------------------------------------*
| TResourceModule.GetUniqueResourceName |
| |
| Generate a unique resource name for a given type. Names start at |
| 1 (though string lists downgrade that to '0') |
*----------------------------------------------------------------------*)
function TResourceModule.GetUniqueResourceName(const tp: string): string;
var
i : Integer;
n, n1 : Integer;
details : TResourceDetails;
begin
n := 0;
for i := 0 to ResourceCount - 1 do
begin
details := ResourceDetails [i];
if details.ResourceType = tp then
begin
n1 := ResourceNametoInt (details.ResourceName);
if n1 > n then
n := n1
end
end;
Result := IntToStr (n + 1);
end;
procedure TResourceModule.InsertResource(idx: Integer;
details: TResourceDetails);
begin
// Stub
end;
(*----------------------------------------------------------------------*
| TResourceModule.LoadFromFile |
| |
| Load from a file. Not usually overriden. |
*----------------------------------------------------------------------*)
procedure TResourceModule.LoadFromFile(const FileName: string);
var
s : TFileStream;
begin
s := TFileStream.Create (FileName, fmOpenRead or fmShareDenyNone);
try
LoadFromStream (s);
finally
s.Free
end
end;
(*----------------------------------------------------------------------*
| TResourceModule.SaveToFile |
| |
| Save to file. This can be overriden but usually isn't as it |
| relies on SaveToStream, which must be. |
*----------------------------------------------------------------------*)
procedure TResourceModule.LoadFromStream(stream: TStream);
begin
raise Exception.Create (rstNoStreaming);
end;
procedure TResourceModule.SaveToFile(const FileName: string);
var
s : TFileStream;
begin
s := TFileStream.Create (FileName, fmCreate);
try
SaveToStream (s);
ClearDirty
finally
s.Free
end
end;
(*----------------------------------------------------------------------*
| TResourceDetails.SupportsData |
| |
| Can be overridden to support a custom resource class, where you can |
| determine the custom class from the data - eg. RIFF data, etc. |
*----------------------------------------------------------------------*)
class function TResourceDetails.SupportsData(Size: Integer;
data: Pointer): Boolean;
begin
Result := False; // stub
end;
(*----------------------------------------------------------------------*
| TResourceDetails.SupportsData |
| |
| Can be overridden to support RC data where you can determine the |
| type from the data and name - eg. the Delphi splash screen JPEG |
*----------------------------------------------------------------------*)
class function TResourceDetails.SupportsRCData(const AName: string;
Size: Integer; data: Pointer): Boolean;
begin
Result := False; // stub
end;
procedure TResourceModule.SaveToStream(stream: TStream);
begin
raise Exception.Create (rstNoStreaming);
end;
procedure TResourceModule.SortResources;
begin
// Stub
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -