* Store object-names in .xib

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2622 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
loesje_
2013-01-14 20:24:22 +00:00
parent 706c667f9f
commit 0b6368ae7b
2 changed files with 156 additions and 65 deletions

View File

@ -121,6 +121,7 @@ type
function GetNextObjectID: integer;
function FindOrderdObjectByRef(ARef: int64): TDOMElement;
protected
procedure SetXIBObjectElement(const AValue: TDOMElement);
procedure AddChild(const AValue: tiOSFakeComponent); virtual;
procedure RemoveChild(const AValue: tiOSFakeComponent); virtual;
procedure SetParentComponent(Value: TComponent); override;
@ -133,6 +134,8 @@ type
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
procedure InternalInvalidateRect(ARect: TRect; Erase: boolean); virtual;
function StoreSizeAsFrameSize: boolean; virtual;
procedure SetName(const NewName: TComponentName); override;
// iOS
procedure AddConnectionRecord(AnObjectDomElement: TDOMElement; AConnectionType, ALabel, AEventType: string);
procedure WriteToDomElement(AnObjectDomElement: TDOMElement); virtual;
@ -556,11 +559,11 @@ type
FRefStack: array of int64;
private
FXIBUsesObjectsForArrays: boolean;
function GetConnectionRef(AnIBConnectionRecord: TDOMElement; key: string): int64;
//function GetConnectionRef(AnIBConnectionRecord: TDOMElement; key: string): int64;
function GetObjectFromRef(ARef: int64): TDOMElement;
function GetConnectionLabel(AnIBConnectionRecord: TDOMElement): string;
function GetNextChild(ACurrentNode: TDOMNode; ParentRef: int64): TDOMElement;
function FindOrderdObjectByRef(ARef: int64): TDOMElement;
function FindOrderedObjectByRef(ARef: int64): TDOMElement;
function FindFirstChild: TDOMElement;
function FindNextChild(ARef: int64): TDOMElement;
function FindNextOrderedObject: TDOMElement;
@ -593,6 +596,12 @@ type
property XIBUsesObjectsForArrays: boolean read FXIBUsesObjectsForArrays;
end;
procedure ObtainBaseObjectInfoFromXIB(AStream: TStream; out AXMLDocument: TXMLDocument;
out ARootObjects, AConnectionRecords, AOrderedObjects, AMainOrderedObject: TDOMElement;
out AFilesOwnerID: int64;
out AXIBUsesObjectsForArrays: boolean);
function FindKeyNode(AParentNode: TDOMNode; NodeName, Key: string): TDOMElement;
implementation
@ -640,7 +649,7 @@ end;
{ TXIBObjectReader }
function TXIBObjectReader.GetConnectionRef(AnIBConnectionRecord: TDOMElement; key: string): int64;
function GetConnectionRef(AnIBConnectionRecord: TDOMElement; key: string): int64;
var
ATempNode: TDOMElement;
AReferenceNode: TDOMElement;
@ -711,13 +720,13 @@ begin
end;
end;
function TXIBObjectReader.FindOrderdObjectByRef(ARef: int64): TDOMElement;
function FindOrderdObjectByRefA(AnOrderedObjects: TDOMElement; ARef: int64): TDOMElement;
var
ANode: TDOMNode;
ARefNode: TDOMElement;
begin
result := nil;
ANode := FOrderedObjects.FirstChild;
ANode := AnOrderedObjects.FirstChild;
while assigned(ANode) do
begin
if (ANode.NodeName='object') and (ANode is TDOMElement) and (TDOMElement(ANode).AttribStrings['class']='IBObjectRecord') then
@ -733,6 +742,11 @@ begin
end;
end;
function TXIBObjectReader.FindOrderedObjectByRef(ARef: int64): TDOMElement;
begin
result := FindOrderdObjectByRefA(FOrderedObjects, ARef);
end;
function TXIBObjectReader.FindFirstChild: TDOMElement;
var
ANode: TDOMNode;
@ -764,6 +778,8 @@ begin
result := nil;
pass := false;
ANode := FindKeyNode(FCurrentOrderedObject,'object','children');
if not assigned(ANode) then
ANode := FindKeyNode(FCurrentOrderedObject,'array','children');
if assigned(ANode) then
begin
ANode := ANode.FirstChild as TDOMElement;
@ -841,7 +857,10 @@ begin
FStream := AStream;
end;
procedure TXIBObjectReader.BeginRootComponent;
procedure ObtainBaseObjectInfoFromXIB(AStream: TStream; out AXMLDocument: TXMLDocument;
out ARootObjects, AConnectionRecords, AOrderedObjects, AMainOrderedObject: TDOMElement;
out AFilesOwnerID: int64;
out AXIBUsesObjectsForArrays: boolean);
var
ArchiveNode, DataNode: TDOMNode;
Objects: TDOMNode;
@ -850,19 +869,22 @@ var
MainObjectRef: int64;
begin
ReadXMLFile(FXMLDocument, FStream);
ReadXMLFile(AXMLDocument, AStream);
ArchiveNode := FXMLDocument.FirstChild;
ArchiveNode := AXMLDocument.FirstChild;
assert(ArchiveNode.NodeName='archive');
DataNode := ArchiveNode.FindNode('data');
FRootObjects := FindKeyNode(DataNode,'array','IBDocument.RootObjects');
if not assigned(FRootObjects) then
ARootObjects := FindKeyNode(DataNode,'array','IBDocument.RootObjects');
if not assigned(ARootObjects) then
// Older XCode versions this:
begin
FRootObjects := FindKeyNode(DataNode,'object','IBDocument.RootObjects');
FXIBUsesObjectsForArrays:=true;
end;
ANode := FRootObjects.FirstChild;
ARootObjects := FindKeyNode(DataNode,'object','IBDocument.RootObjects');
AXIBUsesObjectsForArrays:=true;
end
else
AXIBUsesObjectsForArrays:=False;
ANode := ARootObjects.FirstChild;
while assigned(ANode) do
begin
if (ANode.NodeName='object') and (ANode is TDOMElement) and (TDOMElement(ANode).AttribStrings['class']='IBProxyObject') then
@ -870,7 +892,7 @@ begin
ATempNode := FindKeyNode(ANode, 'string', 'IBProxiedObjectIdentifier');
if ATempNode.TextContent='IBFilesOwner' then
begin
FFilesOwnerID:=StrToInt(TDOMElement(ANode).AttribStrings['id']);
AFilesOwnerID:=StrToInt(TDOMElement(ANode).AttribStrings['id']);
break;
end;
end;
@ -878,24 +900,24 @@ begin
end;
Objects := FindKeyNode(DataNode,'object','IBDocument.Objects');
FConnectionRecords := FindKeyNode(Objects,'array','connectionRecords') as TDOMElement;
if not assigned(FConnectionRecords) then
AConnectionRecords := FindKeyNode(Objects,'array','connectionRecords') as TDOMElement;
if not assigned(AConnectionRecords) then
// Interface builder v3.1 and below uses 'object' instead of 'array'
FConnectionRecords := FindKeyNode(Objects,'object','connectionRecords') as TDOMElement;
AConnectionRecords := FindKeyNode(Objects,'object','connectionRecords') as TDOMElement;
ANode := FindKeyNode(Objects,'object','objectRecords');
FOrderedObjects := FindKeyNode(ANode,'array','orderedObjects');
if not assigned(FOrderedObjects) then
AOrderedObjects := FindKeyNode(ANode,'array','orderedObjects');
if not assigned(AOrderedObjects) then
// Interface builder v3.1 and below uses 'object' instead of 'array'
FOrderedObjects := FindKeyNode(ANode,'object','orderedObjects');
AOrderedObjects := FindKeyNode(ANode,'object','orderedObjects');
MainObjectRef:=0;
ANode := FConnectionRecords.FirstChild;
ANode := AConnectionRecords.FirstChild;
while assigned(ANode) do
begin
if (ANode.NodeName='object') and (ANode is TDOMElement) and (TDOMElement(ANode).AttribStrings['class']='IBConnectionRecord') then
begin
//FCurrentConnectionNode := TDOMElement(ANode);
if GetConnectionRef(TDOMElement(ANode),'source')=FFilesOwnerID then
if GetConnectionRef(TDOMElement(ANode),'source')=AFilesOwnerID then
begin
MainObjectRef:=GetConnectionRef(TDOMElement(ANode),'destination');
break;
@ -905,10 +927,10 @@ begin
end;
if MainObjectRef<>0 then
FMainOrderedObject := FindOrderdObjectByRef(MainObjectRef)
AMainOrderedObject := FindOrderdObjectByRefA(AOrderedObjects, MainObjectRef)
else
begin
ANode := FOrderedObjects.FirstChild;
ANode := AOrderedObjects.FirstChild;
while assigned(ANode) do
begin
if (ANode.NodeName='object') and (ANode is TDOMElement) and (TDOMElement(ANode).AttribStrings['class']='IBObjectRecord') then
@ -916,7 +938,7 @@ begin
ATempNode := FindKeyNode(ANode,'int','objectID');
if StrToIntDef(ATempNode.TextContent,0)>0 then
begin
FMainOrderedObject := ANode as TDOMElement;
AMainOrderedObject := ANode as TDOMElement;
break;
end;
end;
@ -924,7 +946,14 @@ begin
end;
end;
end;
procedure TXIBObjectReader.BeginRootComponent;
begin
ObtainBaseObjectInfoFromXIB(FStream, FXMLDocument, FRootObjects, FConnectionRecords, FOrderedObjects, FMainOrderedObject, FFilesOwnerID, FXIBUsesObjectsForArrays);
FCurrentOrderedObject := FMainOrderedObject;
ReadState := rsMainProp;
end;
@ -938,6 +967,11 @@ begin
ObjectNode := GetObjectFromRef(Ref);
CompClassName:=ObjectNode.AttribStrings['class'];
ObjectNode := FindKeyNode(FCurrentOrderedObject,'string','objectName');
if assigned(ObjectNode) then
CompName:=ObjectNode.TextContent;
if copy(CompClassName,1,2)='IB' then
CompClassName:=copy(CompClassName,3,250);
FReadChilds := False;
@ -987,7 +1021,7 @@ begin
CurrentChildRef := FindFirstChild;
if assigned(CurrentChildRef) then
begin
FCurrentOrderedObject := FindOrderdObjectByRef(StrToInt(CurrentChildRef.AttribStrings['ref']));
FCurrentOrderedObject := FindOrderedObjectByRef(StrToInt(CurrentChildRef.AttribStrings['ref']));
SetLength(FRefStack,length(FRefStack)+1);
FRefStack[high(FRefStack)]:=GetRefFromOrderedObject(FCurrentOrderedObject);
end
@ -1001,7 +1035,7 @@ begin
CurrentChildRef := FindFirstChild;
if assigned(CurrentChildRef) then
begin
FCurrentOrderedObject := FindOrderdObjectByRef(StrToInt(CurrentChildRef.AttribStrings['ref']));
FCurrentOrderedObject := FindOrderedObjectByRef(StrToInt(CurrentChildRef.AttribStrings['ref']));
SetLength(FRefStack,length(FRefStack)+1);
FRefStack[high(FRefStack)]:=GetRefFromOrderedObject(FCurrentOrderedObject);
end
@ -1017,14 +1051,14 @@ begin
begin
ref := FRefStack[high(FRefStack)];
setlength(FRefStack, high(FRefStack));
FCurrentOrderedObject := FindOrderdObjectByRef(ref);
FCurrentOrderedObject := FindOrderedObjectByRef(ref);
ANode := FindKeyNode(FCurrentOrderedObject,'reference','parent');
FCurrentOrderedObject := FindOrderdObjectByRef(StrToInt(ANode.AttribStrings['ref']));
FCurrentOrderedObject := FindOrderedObjectByRef(StrToInt(ANode.AttribStrings['ref']));
CurrentChildRef := FindNextChild(ref);
if assigned(CurrentChildRef) then
begin
FCurrentOrderedObject := FindOrderdObjectByRef(StrToInt(CurrentChildRef.AttribStrings['ref']));
FCurrentOrderedObject := FindOrderedObjectByRef(StrToInt(CurrentChildRef.AttribStrings['ref']));
SetLength(FRefStack,length(FRefStack)+1);
FRefStack[high(FRefStack)]:=GetRefFromOrderedObject(FCurrentOrderedObject);
end
@ -1035,7 +1069,7 @@ begin
begin
ref := FRefStack[high(FRefStack)];
setlength(FRefStack, high(FRefStack));
FCurrentOrderedObject := FindOrderdObjectByRef(ref);
FCurrentOrderedObject := FindOrderedObjectByRef(ref);
FCurrentOrderedObject := FindNextOrderedObject;
if assigned(FCurrentOrderedObject) then
begin
@ -2078,9 +2112,9 @@ var
AFrameNode: TDOMNode;
begin
result := 0;
if assigned(FXIBObjectElement) then
if assigned(XIBObjectElement) then
begin
AFrameNode := FindKeyNode(FXIBObjectElement,'string','NSFrame');
AFrameNode := FindKeyNode(XIBObjectElement,'string','NSFrame');
if assigned(AFrameNode) then
begin
state := sLeft;
@ -2088,7 +2122,7 @@ begin
end
else if APosition in [sWidth, sHeight] then
begin
AFrameNode := FindKeyNode(FXIBObjectElement,'string','NSFrameSize');
AFrameNode := FindKeyNode(XIBObjectElement,'string','NSFrameSize');
if assigned(AFrameNode) then
begin
state := sWidth;
@ -2100,8 +2134,8 @@ end;
function tiOSFakeComponent.GetRef: integer;
begin
if assigned(FXIBObjectElement) then
result := StrToInt(FXIBObjectElement.AttribStrings['id'])
if assigned(XIBObjectElement) then
result := StrToIntDef(XIBObjectElement.AttribStrings['id'],0)
else
result := 0;
end;
@ -2167,6 +2201,26 @@ begin
end;
end;
procedure tiOSFakeComponent.SetXIBObjectElement(const AValue: TDOMElement);
var
AnElement: TDOMElement;
ARef: integer;
begin
FXIBObjectElement := AValue;
if csLoading in ComponentState then
Exit;
if (Name<>'') then
begin
ARef := Ref;
if ARef<>0 then
begin
AnElement := FindOrderdObjectByRef(ARef);
AnElement := GetKeyNode(AnElement,'string','objectName');
AnElement.TextContent:=Name;
end;
end;
end;
procedure tiOSFakeComponent.AddChild(const AValue: tiOSFakeComponent);
var
AComp: UIView;
@ -2192,10 +2246,12 @@ var
begin
if not (csLoading in ComponentState) {and assigned(FXIBObjectElement)} then
begin
AValue.FXIBObjectElement := GetXIBDocument.CreateElement('object');
AValue.SetXIBObjectElement(GetXIBDocument.CreateElement('object'));
ARef := random(999999999);
AValue.FXIBObjectElement.AttribStrings['class'] := AValue.GetIBClassName;
AValue.FXIBObjectElement.AttribStrings['id'] := IntToStr(ARef);
while assigned(AValue.FindOrderdObjectByRef(ARef)) do
ARef := random(999999999);
AValue.XIBObjectElement.AttribStrings['class'] := AValue.GetIBClassName;
AValue.XIBObjectElement.AttribStrings['id'] := IntToStr(ARef);
if GetNSObject.XIBUsesObjectsForArrays then
s := 'object'
@ -2207,14 +2263,16 @@ begin
if IsRootObject then
ANode := GetXIBRootObjects
else
ANode := GetKeyNode(FXIBObjectElement,s,'NSSubviews','NSMutableArray');
ANode := GetKeyNode(XIBObjectElement,s,'NSSubviews','NSMutableArray');
ANode.AppendChild(AValue.FXIBObjectElement);
ANode.AppendChild(AValue.XIBObjectElement);
AOrderedObjects := GetXIBOrderedObjects;
ANode := AddElement(AOrderedObjects,'object');
ANode.AttribStrings['class'] := 'IBObjectRecord';
AddIBInt(ANode,'objectID',GetNextObjectID);
if AValue.Name<>'' then
AddIBString(ANode, 'objectName', AValue.Name);
AddIBReference(ANode, 'object', IntToStr(ARef));
if IsRootObject then
AddIBReference(ANode, 'parent', '0')
@ -2301,9 +2359,9 @@ var
begin
result := clDefault;
if Assigned(FXIBObjectElement) then
if Assigned(XIBObjectElement) then
begin
AnElement := FindKeyNode(FXIBObjectElement, 'object', XIBPropertiesStrings[index].APropertyName);
AnElement := FindKeyNode(XIBObjectElement, 'object', XIBPropertiesStrings[index].APropertyName);
if assigned(AnElement) then
begin
AnElement := FindKeyNode(AnElement, 'bytes', 'NSRGB');
@ -2340,12 +2398,12 @@ begin
if GetXIBColor(index)=AValue then
Exit;
if Assigned(FXIBObjectElement) then
if Assigned(XIBObjectElement) then
begin
if (AValue = clDefault) then
begin
// Value is set to default, remove node
AnElement := FindKeyNode(FXIBObjectElement, 'object', XIBPropertiesStrings[index].APropertyName);
AnElement := FindKeyNode(XIBObjectElement, 'object', XIBPropertiesStrings[index].APropertyName);
if assigned(AnElement) then
AnElement.ParentNode.RemoveChild(AnElement);
end
@ -2360,7 +2418,7 @@ begin
fr := b / $ff;
s := FloatToStr(fr)+' '+FloatToStr(fg)+' '+FloatToStr(fb);
AnElement := FindKeyNode(FXIBObjectElement, 'object', XIBPropertiesStrings[index].APropertyName);
AnElement := FindKeyNode(XIBObjectElement, 'object', XIBPropertiesStrings[index].APropertyName);
if assigned(AnElement) then
begin
AnElement := FindKeyNode(AnElement,'bytes','NSRGB');
@ -2368,7 +2426,7 @@ begin
end
else
begin
AnElement := GetKeyNode(FXIBObjectElement, 'object', XIBPropertiesStrings[index].APropertyName);
AnElement := GetKeyNode(XIBObjectElement, 'object', XIBPropertiesStrings[index].APropertyName);
AnElement.AttribStrings['class'] := 'NSColor';
AddIBInt(AnElement,'NSColorSpace',1);
AddIBBytes(AnElement,'NSRGB',s);
@ -2395,7 +2453,7 @@ procedure tiOSFakeComponent.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
if filer is TXIBReader then
FXIBObjectElement := TXIBObjectReader(TReader(Filer).Driver).FCurrentObject;
SetXIBObjectElement(TXIBObjectReader(TReader(Filer).Driver).FCurrentObject);
end;
function tiOSFakeComponent.GetKeyNode(AParentNode: TDOMNode; NodeName, Key: string; AClass: string): TDOMElement;
@ -2474,6 +2532,19 @@ begin
result := False;
end;
procedure tiOSFakeComponent.SetName(const NewName: TComponentName);
var
AnElement: TDOMElement;
begin
inherited SetName(NewName);
if not (csLoading in ComponentState) and assigned(XIBObjectElement) then
begin
AnElement := FindOrderdObjectByRef(Ref);
AnElement := GetKeyNode(AnElement, 'string','objectName');
AnElement.TextContent := NewName;
end;
end;
procedure tiOSFakeComponent.AddConnectionRecord(AnObjectDomElement: TDOMElement; AConnectionType, ALabel, AEventType: string);
var
IBConnectionRecordElement : TDOMElement;
@ -2619,18 +2690,18 @@ begin
exit;
Invalidate;
if assigned(FXIBObjectElement) then
if assigned(XIBObjectElement) then
begin
if StoreSizeAsFrameSize then
begin
AFrameNode := GetKeyNode(FXIBObjectElement,'string','NSFrameSize');
AFrameNode := GetKeyNode(XIBObjectElement,'string','NSFrameSize');
s := Format('{%d, %d}',[NewWidth, NewHeight]);
FLeft:=NewLeft;
FTop:=NewTop;
end
else
begin
AFrameNode := GetKeyNode(FXIBObjectElement,'string','NSFrame');
AFrameNode := GetKeyNode(XIBObjectElement,'string','NSFrame');
s := Format('{{%d, %d}, {%D, %d}}',[NewLeft, NewTop, NewWidth, NewHeight]);
end;
AFrameNode.TextContent:=s;
@ -3032,7 +3103,7 @@ var
s: string;
ANode: TDOMElement;
begin
ANode := FindKeyNode(FXIBObjectElement, 'reference', 'NSSuperview');
ANode := FindKeyNode(XIBObjectElement, 'reference', 'NSSuperview');
if assigned(ANode) then
begin
s := ANode.AttribStrings['ref'];
@ -3054,16 +3125,16 @@ procedure UIView.SetNSSuperView(AValue: UIView);
var
ANode: TDOMElement;
begin
if not assigned(FXIBObjectElement) then
if not assigned(XIBObjectElement) then
raise exception.create('NoObjectElement');
if assigned(AValue) then
begin
ANode := GetKeyNode(FXIBObjectElement, 'reference', 'NSSuperview');
ANode := GetKeyNode(XIBObjectElement, 'reference', 'NSSuperview');
ANode.AttribStrings['ref'] := IntToStr(AValue.Ref);
end
else
begin
ANode := FindKeyNode(FXIBObjectElement, 'reference', 'NSSuperview');
ANode := FindKeyNode(XIBObjectElement, 'reference', 'NSSuperview');
if assigned(ANode) then
ANode.ParentNode.RemoveChild(ANode);
end;
@ -3076,18 +3147,18 @@ var
begin
if GetXIBString(index, ANodeName)=AValue then
Exit;
if Assigned(FXIBObjectElement) then
if Assigned(XIBObjectElement) then
begin
if (AValue = XIBPropertiesStrings[index].ADefaultValue) then
begin
// Value is set to default, remove node
ANode := FindKeyNode(FXIBObjectElement, ANodeName, XIBPropertiesStrings[index].APropertyName);
ANode := FindKeyNode(XIBObjectElement, ANodeName, XIBPropertiesStrings[index].APropertyName);
if assigned(ANode) then
ANode.ParentNode.RemoveChild(ANode);
end
else
begin
ANode := GetKeyNode(FXIBObjectElement, ANodeName, XIBPropertiesStrings[index].APropertyName);
ANode := GetKeyNode(XIBObjectElement, ANodeName, XIBPropertiesStrings[index].APropertyName);
ANode.TextContent:=AValue;
end;
Invalidate;
@ -3163,9 +3234,9 @@ function tiOSFakeComponent.GetXIBString(index: TXIBProperties; ANodeName: string
var
ANode: TDOMNode;
begin
if Assigned(FXIBObjectElement) then
if Assigned(XIBObjectElement) then
begin
ANode := FindKeyNode(FXIBObjectElement, ANodeName, XIBPropertiesStrings[index].APropertyName);
ANode := FindKeyNode(XIBObjectElement, ANodeName, XIBPropertiesStrings[index].APropertyName);
if not assigned(ANode) then
result := XIBPropertiesStrings[index].ADefaultValue
else

View File

@ -45,7 +45,6 @@ var
nx,ny,nt: integer;
r,p: integer;
begin
// CodeToolBoss.find;
r := FindNextCompilerDirectiveWithName((source as TCodeBuffer).Source, -1, 'FakeResource', False, p);
result := (r > -1)
end;
@ -76,7 +75,7 @@ end;
class function TXIBResourcefileFormat.GetClassNameFromStream(s: TStream; out
IsInherited: Boolean): shortstring;
begin
result := 'TSObject1';
result := 'TAppDelegate_iPhone';
end;
class function TXIBResourcefileFormat.CreateReader(s: TStream;
@ -94,11 +93,32 @@ end;
class function TXIBResourcefileFormat.QuickCheckResourceBuffer(PascalBuffer,
LFMBuffer: TObject; out LFMType, LFMComponentName, LFMClassName: string; out
LCLVersion: string; out MissingClasses: TStrings): TModalResult;
var
ms: TStream;
XMLDocument: TXMLDocument;
RO, CR, OO, MO : TDOMElement;
i: int64;
b: boolean;
AnElement: TDOMElement;
begin
ms := TStringStream.Create((LFMBuffer as TCodeBuffer).Source);
try
ObtainBaseObjectInfoFromXIB(ms, XMLDocument, RO, CR, OO, MO,i, b);
try
AnElement := FindKeyNode(MO,'string','objectName');
if assigned(AnElement) then
LFMComponentName:=AnElement.TextContent;
finally
XMLDocument.Free;
end;
finally
ms.Free;
end;
LCLVersion:='1.1';
LFMType:='unknown';
LFMClassName:='TSObject1';
LFMComponentName:='SObject1';
LFMClassName:='TAppDelegate_iPhone';
end;
end.