Changeset 173


Ignore:
Timestamp:
Jun 15, 2024, 11:02:39 AM (11 days ago)
Author:
chronos
Message:
  • Modified: TNameDetails class moved into separate file.
Location:
trunk
Files:
4 added
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/Forms/FormContact.pas

    r165 r173  
    259259
    260260uses
    261   Core, Common, FormImage, FormNameDetails, DataFile;
     261  Core, Common, FormImage, FormNameDetails, DataFile, NameDetails;
    262262
    263263resourcestring
  • trunk/Languages/vCardStudio.cs.po

    r168 r173  
    10091009
    10101010#: tformfindduplicity.buttonmerge.caption
     1011msgctxt "tformfindduplicity.buttonmerge.caption"
    10111012msgid "Merge"
    10121013msgstr "Sloučit"
     
    11551156msgstr "Zobrazení"
    11561157
     1158#: tformmerge.buttoncancel.caption
     1159#, fuzzy
     1160msgctxt "tformmerge.buttoncancel.caption"
     1161msgid "Cancel"
     1162msgstr "Zrušit"
     1163
     1164#: tformmerge.buttonok.caption
     1165#, fuzzy
     1166msgctxt "tformmerge.buttonok.caption"
     1167msgid "OK"
     1168msgstr "OK"
     1169
     1170#: tformmerge.caption
     1171#, fuzzy
     1172msgctxt "tformmerge.caption"
     1173msgid "Merge"
     1174msgstr "Sloučit"
     1175
     1176#: tformmerge.listview1.columns[0].caption
     1177msgid "Id"
     1178msgstr ""
     1179
     1180#: tformmerge.listview1.columns[1].caption
     1181msgid "File name"
     1182msgstr ""
     1183
    11571184#: tformnamedetails.buttoncancel.caption
    11581185msgctxt "tformnamedetails.buttoncancel.caption"
  • trunk/Languages/vCardStudio.pot

    r168 r173  
    999999
    10001000#: tformfindduplicity.buttonmerge.caption
     1001msgctxt "tformfindduplicity.buttonmerge.caption"
    10011002msgid "Merge"
    10021003msgstr ""
     
    11451146msgstr ""
    11461147
     1148#: tformmerge.buttoncancel.caption
     1149msgctxt "tformmerge.buttoncancel.caption"
     1150msgid "Cancel"
     1151msgstr ""
     1152
     1153#: tformmerge.buttonok.caption
     1154msgctxt "tformmerge.buttonok.caption"
     1155msgid "OK"
     1156msgstr ""
     1157
     1158#: tformmerge.caption
     1159msgctxt "tformmerge.caption"
     1160msgid "Merge"
     1161msgstr ""
     1162
     1163#: tformmerge.listview1.columns[0].caption
     1164msgid "Id"
     1165msgstr ""
     1166
     1167#: tformmerge.listview1.columns[1].caption
     1168msgid "File name"
     1169msgstr ""
     1170
    11471171#: tformnamedetails.buttoncancel.caption
    11481172msgctxt "tformnamedetails.buttoncancel.caption"
  • trunk/Languages/vCardStudio.sv.po

    r168 r173  
    10171017
    10181018#: tformfindduplicity.buttonmerge.caption
     1019msgctxt "tformfindduplicity.buttonmerge.caption"
    10191020msgid "Merge"
    10201021msgstr ""
     
    11661167msgstr "Vy"
    11671168
     1169#: tformmerge.buttoncancel.caption
     1170#, fuzzy
     1171msgctxt "tformmerge.buttoncancel.caption"
     1172msgid "Cancel"
     1173msgstr "Avbryt"
     1174
     1175#: tformmerge.buttonok.caption
     1176#, fuzzy
     1177msgctxt "tformmerge.buttonok.caption"
     1178msgid "OK"
     1179msgstr "Ok"
     1180
     1181#: tformmerge.caption
     1182msgctxt "tformmerge.caption"
     1183msgid "Merge"
     1184msgstr ""
     1185
     1186#: tformmerge.listview1.columns[0].caption
     1187msgid "Id"
     1188msgstr ""
     1189
     1190#: tformmerge.listview1.columns[1].caption
     1191msgid "File name"
     1192msgstr ""
     1193
    11681194#: tformnamedetails.buttoncancel.caption
    11691195msgctxt "tformnamedetails.buttoncancel.caption"
  • trunk/Packages/Common/Common.pas

    r164 r173  
    5353function ComputerName: string;
    5454procedure DeleteFiles(APath, AFileSpec: string);
     55function EndsWith(Text, What: string): Boolean;
    5556function Explode(Separator: Char; Data: string): TStringArray;
    5657procedure ExecuteProgram(Executable: string; Parameters: array of string);
     
    8788procedure SearchFiles(AList: TStrings; Dir: string;
    8889  FilterMethod: TFilterMethod = nil; FileNameMethod: TFileNameMethod = nil);
     90procedure SortStrings(Strings: TStrings);
    8991function SplitString(var Text: string; Count: Word): string;
    9092function StripTags(const S: string): string;
     93function StartsWith(Text, What: string): Boolean;
    9194function TryHexToInt(Data: string; out Value: Integer): Boolean;
    9295function TryBinToInt(Data: string; out Value: Integer): Boolean;
    93 procedure SortStrings(Strings: TStrings);
    9496
    9597
    9698implementation
     99
     100function StartsWith(Text, What: string): Boolean;
     101begin
     102  Result := Copy(Text, 1, Length(Text)) = What;
     103end;
     104
     105function EndsWith(Text, What: string): Boolean;
     106begin
     107  Result := Copy(Text, Length(Text) - Length(What) + 1, MaxInt) = What;
     108end;
    97109
    98110function BinToInt(BinStr : string) : Int64;
  • trunk/Packages/Common/Languages/DataFile.cs.po

    r172 r173  
    2121msgid "Data file"
    2222msgstr "Datový soubor"
     23
  • trunk/Packages/Common/Languages/DebugLog.cs.po

    r172 r173  
    1616msgid "Filename not defined"
    1717msgstr "Neurčen soubor"
     18
  • trunk/Packages/Common/Languages/FindFile.cs.po

    r172 r173  
    1616msgid "Directory not found"
    1717msgstr "Adresář nenalezen"
     18
  • trunk/Packages/Common/Languages/FormAbout.cs.po

    r172 r173  
    2727msgstr "Verze"
    2828
    29 #: tformabout.caption
    30 msgid "About"
    31 msgstr "O aplikaci"
  • trunk/Packages/Common/Languages/FormAbout.pot

    r172 r173  
    1414msgstr ""
    1515
    16 #: tformabout.caption
    17 msgid "About"
    18 msgstr ""
    19 
  • trunk/Packages/Common/Languages/JobProgressView.cs.po

    r172 r173  
    4343msgid "Total estimated time: %s"
    4444msgstr "Celkový odhadovaný čas: %s"
     45
  • trunk/Packages/Common/Languages/Languages.cs.po

    r172 r173  
    977977msgstr "Čínština"
    978978
     979#: languages.slang_zh_hans
     980msgid "Simplified Chinese"
     981msgstr ""
     982
     983#: languages.slang_zh_hant
     984msgid "Traditional Chinese"
     985msgstr ""
     986
    979987#: languages.slang_zu
    980988msgctxt "languages.slang_zu"
    981989msgid "Zulu"
    982990msgstr "Zuluština"
     991
  • trunk/Packages/Common/Languages/Languages.pot

    r148 r173  
    776776msgstr ""
    777777
     778#: languages.slang_zh_hans
     779msgid "Simplified Chinese"
     780msgstr ""
     781
     782#: languages.slang_zh_hant
     783msgid "Traditional Chinese"
     784msgstr ""
     785
    778786#: languages.slang_zu
    779787msgid "Zulu"
  • trunk/Packages/Common/Languages/Pool.cs.po

    r172 r173  
    2121msgid "Unknown object for release from pool"
    2222msgstr "Neznýmý objekt pro uvolnění ze zásobníku"
     23
  • trunk/Packages/Common/Languages/ResetableThread.cs.po

    r172 r173  
    1616msgid "WaitFor error"
    1717msgstr "Chyba WaitFor"
     18
  • trunk/Packages/Common/Languages/ScaleDPI.cs.po

    r172 r173  
    1717msgid "Wrong DPI [%d,%d]"
    1818msgstr "Chybné DPI [%d,%d]"
     19
  • trunk/Packages/Common/Languages/TestCase.cs.po

    r172 r173  
    2626msgid "Passed"
    2727msgstr "Prošlo"
     28
  • trunk/Packages/Common/Languages/Threading.cs.po

    r172 r173  
    1717msgid "Current thread ID %d not found in virtual thread list."
    1818msgstr "Aktuální vlákno ID %d nenalezeno v seznamu virtuálních vláken."
     19
  • trunk/Packages/VCard/VCard.lpk

    r152 r173  
    6161        <UnitName Value="VCardProcessor"/>
    6262      </Item>
     63      <Item>
     64        <Filename Value="NameDetails.pas"/>
     65        <UnitName Value="NameDetails"/>
     66      </Item>
    6367    </Files>
    6468    <i18n>
  • trunk/Packages/VCard/VCard.pas

    r170 r173  
    88
    99type
    10   TNamePartKind = (npNone, npPrefix, npFirst, npMiddle, npLast, npSuffix);
    11 
    12   TNamePart = record
    13     Index: Integer;
    14     Text: string;
    15     PartKind: TNamePartKind;
    16     NamePart: ^TNamePart;
    17     Previous: ^TNamePart;
    18     Next: ^TNamePart;
    19   end;
    20 
    21   TNameParts = array of TNamePart;
    22 
    23   { TNameDetails }
    24 
    25   TNameDetails = class
    26   private
    27     function GetAsNameParts: TNameParts;
    28     function GetDetail(NamePartKind: TNamePartKind): string;
    29     function IsSuffix(Text: string): Boolean;
    30   public
    31     Prefix: string;
    32     First: string;
    33     Middle: string;
    34     Last: string;
    35     Suffix: string;
    36     procedure Split(FullName: string);
    37     function GetCombined: string;
    38   end;
    39 
    4010  TErrorEvent = procedure (Text: string; Line: Integer) of object;
    4111
     
    394364end;
    395365
    396 function StartsWith(Text, What: string): Boolean;
    397 begin
    398   Result := Copy(Text, 1, Length(Text)) = What;
    399 end;
    400 
    401 function EndsWith(Text, What: string): Boolean;
    402 begin
    403   Result := Copy(Text, Length(Text) - Length(What) + 1, MaxInt) = What;
    404 end;
    405 
    406366function EncodeEscaped(Text: string): string;
    407367var
     
    479439end;
    480440
    481 { TNameDetails }
    482 
    483 function IsNumber(Text: string): Boolean;
    484 var
    485   Value: Integer;
    486 begin
    487   Result := TryStrToInt(Text, Value);
    488 end;
    489 
    490 function IsRomanNumber(Text: string): Boolean;
    491 var
    492   I: Integer;
    493 begin
    494   Result := True;
    495   for I := 1 to Length(Text) do
    496     if not (Text[I] in ['I', 'V', 'X', 'L', 'C', 'D', 'M']) then begin
    497       Result := False;
    498       Break;
    499     end;
    500 end;
    501 
    502 procedure SearchPart(var NameParts: TNameParts; var NamePart: TNamePart);
    503 var
    504   I: Integer;
    505 begin
    506   for I := 0 to Length(NameParts) - 1 do begin
    507     if (NameParts[I].PartKind = npNone) and (NameParts[I].Text = NamePart.Text) then begin
    508       NameParts[I].PartKind := NamePart.PartKind;
    509       NameParts[I].NamePart := @NamePart;
    510       NamePart.NamePart := @NameParts[I];
    511       Break;
    512     end;
    513   end;
    514 end;
    515 
    516 procedure SearchPartBackward(var NameParts: TNameParts; var NamePart: TNamePart);
    517 var
    518   I: Integer;
    519 begin
    520   for I := Length(NameParts) - 1 downto 0 do begin
    521     if (NameParts[I].PartKind = npNone) and (NameParts[I].Text = NamePart.Text) then begin
    522       NameParts[I].PartKind := NamePart.PartKind;
    523       NameParts[I].NamePart := @NamePart;
    524       NamePart.NamePart := @NameParts[I];
    525       Break;
    526     end;
    527   end;
    528 end;
    529 
    530 function UsedInNameParts(NamePart: TNamePartKind; NameParts: TNameParts): Boolean;
    531 var
    532   I: Integer;
    533 begin
    534   I := 0;
    535   while (I < Length(NameParts)) and (NameParts[I].PartKind <> NamePart) do Inc(I);
    536   Result := I < Length(NameParts);
    537 end;
    538 
    539441{ TVCard }
    540442
     
    795697  FreeAndNil(Contacts);
    796698  inherited;
    797 end;
    798 
    799 function TNameDetails.GetAsNameParts: TNameParts;
    800 var
    801   I: Integer;
    802   K: TNamePartKind;
    803   Parts: TStringArray;
    804 begin
    805   Result := Default(TNameParts);
    806   for K := Low(TNamePartKind) to High(TNamePartKind) do begin
    807     if GetDetail(K) <> '' then begin
    808       Parts := Explode(' ', GetDetail(K));
    809       for I := 0 to Length(Parts) - 1 do begin
    810         SetLength(Result, Length(Result) + 1);
    811         Result[Length(Result) - 1].Text := Parts[I];
    812         Result[Length(Result) - 1].PartKind := K;
    813         Result[Length(Result) - 1].Index := Length(Result) - 1;
    814       end;
    815     end;
    816   end;
    817 
    818   // Update previous and next links
    819   for I := 0 to Length(Result) - 1 do begin
    820     if I > 0 then
    821       Result[I].Previous := @Result[I - 1];
    822     if (I + 1) < Length(Result) then
    823       Result[I].Next := @Result[I + 1];
    824   end;
    825 end;
    826 
    827 function TNameDetails.GetDetail(NamePartKind: TNamePartKind): string;
    828 begin
    829   case NamePartKind of
    830     npPrefix: Result := Prefix;
    831     npFirst: Result := First;
    832     npMiddle: Result := Middle;
    833     npLast: Result := Last;
    834     npSuffix: Result := Suffix;
    835   end;
    836 end;
    837 
    838 function TNameDetails.IsSuffix(Text: string): Boolean;
    839 begin
    840   Result := (Pos('.', Text) > 0) or IsNumber(Text) or
    841     IsRomanNumber(Text);
    842 end;
    843 
    844 procedure TNameDetails.Split(FullName: string);
    845 var
    846   Parts: TStringArray;
    847   NewNameParts: TNameParts;
    848   OldNameParts: TNameParts;
    849   I: Integer;
    850   J: Integer;
    851   Text: string;
    852   NextKind: TNamePartKind;
    853 begin
    854   OldNameParts := GetAsNameParts;
    855 
    856   Text := FullName;
    857   while Pos('  ', FullName) > 0 do
    858     FullName := StringReplace(FullName, '  ', ' ', [rfReplaceAll]);
    859   Text := Trim(Text);
    860 
    861   Parts := Explode(' ', Text);
    862   NewNameParts := Default(TNameParts);
    863   SetLength(NewNameParts, Length(Parts));
    864   for I := 0 to Length(NewNameParts) - 1 do begin
    865     NewNameParts[I].Index := I;
    866     NewNameParts[I].PartKind := npNone;
    867     NewNameParts[I].Text := Parts[I];
    868     if I > 0 then
    869       NewNameParts[I].Previous := @NewNameParts[I - 1];
    870     if (I + 1) < Length(NewNameParts) then
    871       NewNameParts[I].Next := @NewNameParts[I + 1];
    872   end;
    873 
    874   // Match existing parts
    875   for I := 0 to Length(OldNameParts) - 1 do begin
    876     if OldNameParts[I].Text <> '' then
    877       SearchPart(NewNameParts, OldNameParts[I]);
    878   end;
    879 
    880   // Check incorrect matches
    881   for I := 0 to Length(OldNameParts) - 1 do begin
    882     for J := I + 1 to Length(OldNameParts) - 1 do
    883       if Assigned(OldNameParts[I].NamePart) and Assigned(OldNameParts[J].NamePart) and
    884       (OldNameParts[I].NamePart^.Index >= OldNameParts[J].NamePart^.Index) then begin
    885         if Abs(I - OldNameParts[I].NamePart^.Index) >
    886         Abs(J - OldNameParts[J].NamePart^.Index) then begin
    887           OldNameParts[I].NamePart^.PartKind := npNone;
    888           OldNameParts[I].NamePart^.NamePart := nil;
    889           OldNameParts[I].NamePart := nil;
    890         end else begin
    891           OldNameParts[J].NamePart^.PartKind := npNone;
    892           OldNameParts[J].NamePart^.NamePart := nil;
    893           OldNameParts[J].NamePart := nil;
    894         end;
    895       end;
    896   end;
    897   for I := Length(OldNameParts) - 1 downto 0 do begin
    898     for J := I - 1 downto 0 do
    899       if Assigned(OldNameParts[I].NamePart) and Assigned(OldNameParts[J].NamePart) and
    900       (OldNameParts[I].NamePart^.Index <= OldNameParts[J].NamePart^.Index) then begin
    901         if Abs(I - OldNameParts[I].NamePart^.Index) >
    902         Abs(J - OldNameParts[J].NamePart^.Index) then begin
    903           OldNameParts[I].NamePart^.PartKind := npNone;
    904           OldNameParts[I].NamePart^.NamePart := nil;
    905           OldNameParts[I].NamePart := nil;
    906         end else begin
    907           OldNameParts[J].NamePart^.PartKind := npNone;
    908           OldNameParts[J].NamePart^.NamePart := nil;
    909           OldNameParts[J].NamePart := nil;
    910         end;
    911       end;
    912   end;
    913 
    914   // Match existing parts backqards
    915   for I := Length(OldNameParts) - 1 downto 0 do begin
    916     if (OldNameParts[I].Text <> '') and not Assigned(OldNameParts[I].NamePart) then
    917       SearchPartBackward(NewNameParts, OldNameParts[I]);
    918   end;
    919 
    920   // Match uncertain parts
    921   for I := 0 to Length(OldNameParts) - 1 do
    922     if not Assigned(OldNameParts[I].NamePart) then begin
    923       if Assigned(OldNameParts[I].Next) and
    924       Assigned(OldNameParts[I].Next^.NamePart) and
    925       Assigned(OldNameParts[I].Next^.NamePart^.Previous) and
    926       (OldNameParts[I].Next^.NamePart^.Previous^.PartKind = npNone) then begin
    927         OldNameParts[I].NamePart := OldNameParts[I].Next^.NamePart^.Previous;
    928         OldNameParts[I].Next^.NamePart^.Previous^.NamePart := @OldNameParts[I];
    929         OldNameParts[I].Next^.NamePart^.Previous^.PartKind := OldNameParts[I].PartKind;
    930       end else
    931       if Assigned(OldNameParts[I].Previous) and
    932       Assigned(OldNameParts[I].Previous^.NamePart) and
    933       Assigned(OldNameParts[I].Previous^.NamePart^.Next) and
    934       (OldNameParts[I].Previous^.NamePart^.Next^.PartKind = npNone) then begin
    935         OldNameParts[I].NamePart := OldNameParts[I].Previous^.NamePart^.Next;
    936         OldNameParts[I].Previous^.NamePart^.Next^.NamePart := @OldNameParts[I];
    937         OldNameParts[I].Previous^.NamePart^.Next^.PartKind := OldNameParts[I].PartKind;
    938       end;
    939     end;
    940 
    941   // Mark new unknown parts according existing parts
    942   for I := Length(Parts) - 1 downto 0 do
    943     if (NewNameParts[I].PartKind = npNone) and
    944     Assigned(NewNameParts[I].Next) and
    945     (NewNameParts[I].Next^.PartKind <> npNone) then begin
    946       if (NewNameParts[I].Next^.PartKind = npFirst) and
    947       EndsWith(NewNameParts[I].Text, '.') then begin
    948         NewNameParts[I].PartKind := npPrefix;
    949       end else NewNameParts[I].PartKind := NewNameParts[I].Next^.PartKind;
    950     end;
    951 
    952   // Mark unknown parts according to neighbouring parts
    953   for I := 0 to Length(Parts) - 1 do
    954     if (NewNameParts[I].PartKind = npNone) and
    955     Assigned(NewNameParts[I].Previous) and
    956     (NewNameParts[I].Previous^.PartKind <> npNone) then begin
    957       if (NewNameParts[I].Previous^.PartKind in [npLast, npMiddle]) and
    958       IsSuffix(NewNameParts[I].Text) then begin
    959         NewNameParts[I].PartKind := npSuffix;
    960       end else
    961       if (NewNameParts[I].Previous^.PartKind = npFirst) and
    962       (Last = '') then begin
    963         NewNameParts[I].PartKind := npLast;
    964       end else
    965       if (NewNameParts[I].Previous^.PartKind = npLast) and
    966       (Middle = '') then begin
    967         NewNameParts[I].PartKind := npLast;
    968         NewNameParts[I].Previous^.PartKind := npMiddle;
    969       end else
    970       if (NewNameParts[I].Previous^.PartKind = npPrefix) then begin
    971         NewNameParts[I].PartKind := npFirst;
    972       end else
    973         NewNameParts[I].PartKind := NewNameParts[I].Previous^.PartKind;
    974     end;
    975 
    976   // Mark remaining unknown parts based on defined filling sequence
    977   NextKind := npFirst;
    978   for I := 0 to Length(Parts) - 1 do
    979     if NewNameParts[I].PartKind = npNone then begin
    980       if EndsWith(NewNameParts[I].Text, '.') and (NextKind = npFirst) then begin
    981         NewNameParts[I].PartKind := npPrefix;
    982       end else
    983       if (NextKind = npMiddle) and IsSuffix(NewNameParts[I].Text) then begin
    984         NewNameParts[I].PartKind := npSuffix;
    985         NextKind := npSuffix;
    986       end else
    987       if NextKind = npMiddle then begin
    988         NewNameParts[I].Previous^.PartKind := npMiddle;
    989         NewNameParts[I].PartKind := npLast;
    990       end else begin
    991         NewNameParts[I].PartKind := NextKind;
    992         if NextKind = npFirst then NextKind := npLast
    993         else if NextKind = npLast then NextKind := npMiddle;
    994       end;
    995     end;
    996 
    997   // Combine multiple parts to base parts
    998   Prefix := '';
    999   First := '';
    1000   Middle := '';
    1001   Last := '';
    1002   Suffix := '';
    1003   for I := 0 to Length(Parts) - 1 do
    1004     case NewNameParts[I].PartKind of
    1005       npPrefix: Prefix := Trim(Prefix + ' ' + Parts[I]);
    1006       npFirst: First := Trim(First + ' ' + Parts[I]);
    1007       npMiddle: Middle := Trim(Middle + ' ' + Parts[I]);
    1008       npLast: Last := Trim(Last + ' ' + Parts[I]);
    1009       npSuffix: Suffix := Trim(Suffix + ' ' + Parts[I]);
    1010     end;
    1011 
    1012 {
    1013   // Title Prefix
    1014   while (Length(Parts) > 0) and EndsWith(Parts[0], '.') do begin
    1015     Prefix := Trim(Prefix + ' ' + Parts[0]);
    1016     Delete(Parts, 0, 1);
    1017   end;
    1018 
    1019   // Title Suffix
    1020   if ProcessAfter then
    1021   for I := 0 to High(Parts) do
    1022     if (Pos('.', Parts[I]) > 0) or IsNumber(Parts[I]) or IsRomanNumber(Parts[I]) then begin
    1023       for J := I to High(Parts) do
    1024         Suffix := Trim(Suffix + ' ' + Parts[J]);
    1025       SetLength(Parts, I);
    1026       Break;
    1027     end;
    1028 
    1029   if Length(Parts) = 0 then begin
    1030   end else
    1031   if Length(Parts) = 1 then begin
    1032     First := Parts[0];
    1033   end else
    1034   if Length(Parts) = 2 then begin
    1035     First := Parts[0];
    1036     Last := Parts[1];
    1037   end else begin
    1038     First := Parts[0];
    1039     for I := 0 to Length(Parts) - 3 do
    1040       Middle := Trim(Middle + ' ' + Parts[I + 1]);
    1041     Last := Parts[High(Parts)];
    1042   end;}
    1043 end;
    1044 
    1045 function TNameDetails.GetCombined: string;
    1046 begin
    1047   Result := '';
    1048   if Prefix <> '' then Result := Result + ' ' + Prefix;
    1049   if First <> '' then Result := Result + ' ' + First;
    1050   if Middle <> '' then Result := Result + ' ' + Middle;
    1051   if Last <> '' then Result := Result + ' ' + Last;
    1052   if Suffix <> '' then Result := Result + ' ' + Suffix;
    1053   Result := Trim(Result);
    1054699end;
    1055700
  • trunk/Packages/VCard/VCardPackage.pas

    r152 r173  
    99
    1010uses
    11   VCard, QuotedPrintable, ContactImage, VCardProcessor, LazarusPackageIntf;
     11  VCard, QuotedPrintable, ContactImage, VCardProcessor, NameDetails,
     12  LazarusPackageIntf;
    1213
    1314implementation
  • trunk/vCardStudio.lpi

    r167 r173  
    123123      </Item7>
    124124    </RequiredPackages>
    125     <Units Count="26">
     125    <Units Count="27">
    126126      <Unit0>
    127127        <Filename Value="vCardStudio.lpr"/>
     
    288288        <ResourceBaseClass Value="Form"/>
    289289      </Unit25>
     290      <Unit26>
     291        <Filename Value="Forms\FormMerge.pas"/>
     292        <IsPartOfProject Value="True"/>
     293        <ComponentName Value="FormMerge"/>
     294        <HasResources Value="True"/>
     295        <ResourceBaseClass Value="Form"/>
     296      </Unit26>
    290297    </Units>
    291298  </ProjectOptions>
  • trunk/vCardStudio.lpr

    r167 r173  
    77  Interfaces, // this includes the LCL widgetset
    88  Forms, FormMain, Core, Diff, SysUtils, FormCompareSideBySide, TestCases,
    9   VCardFile, FormColumns, FormCompare, FormNormalize, FormExport, FormImport;
     9  VCardFile, FormColumns, FormCompare, FormNormalize, FormExport, FormImport,
     10  FormMerge;
    1011
    1112{$R *.res}
Note: See TracChangeset for help on using the changeset viewer.