Changeset 230 for trunk/Acronym.pas


Ignore:
Timestamp:
Jan 24, 2025, 11:42:58 PM (9 days ago)
Author:
chronos
Message:
  • Modified: Fixed Import sources modification.
  • Modified: Catogires don't have direct object references to import sources and acronym meanings.
  • Modified: Updated acronyms example file.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Acronym.pas

    r226 r230  
    2424    Name: string;
    2525    Meanings: TAcronymMeanings;
     26    procedure Assign(Source: TAcronym);
    2627    procedure SaveToNode(Node: TDOMNode);
    2728    procedure LoadFromNode(Node: TDOMNode);
     
    3435  TAcronyms = class(TObjectList<TAcronym>)
    3536    Db: TAcronymDb;
     37    procedure Assign(Source: TAcronyms);
    3638    procedure SaveToNode(Node: TDOMNode);
    3739    procedure LoadFromNode(Node: TDOMNode);
     
    5052    Categories: TAcronymCategories;
    5153    Sources: TImportSources;
     54    procedure Assign(Source: TAcronymMeaning);
    5255    procedure MergeCategories(MergedCategories: TAcronymCategories);
    5356    procedure SaveToNode(Node: TDOMNode);
     
    6265  public
    6366    Acronym: TAcronym;
     67    procedure Assign(Source: TAcronymMeanings);
    6468    procedure UpdateIds;
    6569    procedure SaveToNode(Node: TDOMNode);
     
    7579    Id: Integer;
    7680    Name: string;
    77     AcronymMeanings: TAcronymMeanings;
    78     ImportSources: TImportSources;
    7981    Enabled: Boolean;
     82    AcronymDb: TAcronymDb;
     83    function GetAcronymMeanings: TAcronymMeanings;
     84    function GetAcronymMeaningsCount: Integer;
     85    function GetImportSources: TImportSources;
     86    function GetImportSourcesCount: Integer;
    8087    procedure Assign(Source: TAcronymCategory);
    8188    procedure SaveToNode(Node: TDOMNode);
    8289    procedure LoadFromNode(Node: TDOMNode);
    8390    constructor Create;
    84     destructor Destroy; override;
    8591  end;
    8692
     
    103109    procedure Assign(Source: TAcronymCategories);
    104110    function GetString: string;
    105     procedure UpdateLinkImportSources(Item: TImportSource);
    106     procedure UpdateLinkAcronymMeanings(Item: TAcronymMeaning);
    107111    function IsAnyEnabled: Boolean;
    108112  end;
     
    164168
    165169  TImportFormats = class(TObjectList<TImportFormat>)
     170    procedure Assign(Source: TImportFormats);
    166171    procedure UpdateIds;
    167172    procedure SaveToNode(Node: TDOMNode);
     
    177182    ResponseStream: TMemoryStream;
    178183    procedure DoPassword(Sender: TObject; var RepeatRequest : Boolean);
    179     procedure TextParse(S: string);
     184    procedure TextParse(AcronymDb: TAcronymDb; S: string);
    180185  public
    181186    Id: Integer;
     
    191196    Password: string;
    192197    function DownloadHTTP(URL: string; Stream: TStream): Boolean;
    193     procedure Process;
    194     procedure ProcessTextParseURL;
    195     procedure ProcessTextParseFile;
    196     procedure ProcessMSAccess;
     198    procedure Process(AcronymDb: TAcronymDb);
     199    procedure ProcessTextParseURL(AcronymDb: TAcronymDb);
     200    procedure ProcessTextParseFile(AcronymDb: TAcronymDb);
     201    procedure ProcessMSAccess(AcronymDb: TAcronymDb);
    197202    procedure Assign(Source: TImportSource);
    198203    procedure SaveToNode(Node: TDOMNode);
     
    211216    procedure LoadRefFromNode(Node: TDOMNode);
    212217    procedure AssignToStrings(Strings: TStrings);
     218    procedure Assign(Source: TImportSources);
    213219    function SearchByName(Name: string): TImportSource;
    214220    procedure SaveToNode(Node: TDOMNode);
     
    233239    constructor Create;
    234240    destructor Destroy; override;
     241    procedure Assign(Source: TAcronymDb);
    235242    procedure LoadFromFile(FileName: string);
    236243    procedure SaveToFile(FileName: string);
     
    307314{ TImportSourceMSAccess }
    308315
    309 procedure TImportSource.ProcessMSAccess;
     316procedure TImportSource.ProcessMSAccess(AcronymDb: TAcronymDb);
    310317var
    311318  ODBCConnection1: TODBCConnection;
     
    342349      NewAcronym.Meaning := Trim(WinCPToUTF8(SQLQuery1.FieldByName('Meaning').AsString));
    343350      if (NewAcronym.Name <> '') and (NewAcronym.Meaning <> '') then begin
    344         AddedAcronym := Sources.AcronymDb.AddAcronym(NewAcronym.Name, NewAcronym.Meaning);
     351        AddedAcronym := AcronymDb.AddAcronym(NewAcronym.Name, NewAcronym.Meaning);
    345352        AddedAcronym.MergeCategories(Categories);
    346353        if AddedAcronym.Sources.IndexOf(Self) = -1 then
     
    437444end;
    438445
    439 procedure TImportSource.TextParse(S: string);
     446procedure TImportSource.TextParse(AcronymDb: TAcronymDb; S: string);
    440447var
    441448  SS: string;
     
    490497    with Format.ItemPatterns[I] do begin
    491498      if Flag <> ipfRemove then begin
     499        TT := StartString;
    492500        if Length(StartString) > 0 then begin
    493501          P := Pos(StartString, S);
     
    523531                  end;
    524532                  TT := Trim(TT);
    525                   NewCategory := Sources.AcronymDb.Categories.SearchByName(TT);
     533                  NewCategory := AcronymDb.Categories.SearchByName(TT);
    526534                  if not Assigned(NewCategory) then begin
    527535                    NewCategory := TAcronymCategory.Create;
    528536                    NewCategory.Name := TT;
    529                     Sources.AcronymDb.Categories.Add(NewCategory);
     537                    AcronymDb.Categories.Add(NewCategory);
    530538                  end;
    531539                  NewAcronym.Categories.AddObject(TT, NewCategory);
     
    538546          if (Flag = ipfNewItem) and (NewAcronym.Name <> '') and
    539547            (NewAcronym.Meaning <> '') then begin
    540               AddedAcronym := Sources.AcronymDb.AddAcronym(NewAcronym.Name, NewAcronym.Meaning);
     548              AddedAcronym := AcronymDb.AddAcronym(NewAcronym.Name, NewAcronym.Meaning);
    541549              AddedAcronym.Description := NewAcronym.Description;
    542550              AddedAcronym.MergeCategories(Categories);
    543551              AddedAcronym.Categories.AddFromStrings(NewAcronym.Categories);
    544               AddedAcronym.Categories.UpdateLinkAcronymMeanings(AddedAcronym);
    545552              if AddedAcronym.Sources.IndexOf(Self) = -1 then
    546553                AddedAcronym.Sources.Add(Self);
     
    593600  I: Integer;
    594601begin
    595   List.Clear;
     602  List.Count := Count;
    596603  for I := 0 to Count - 1 do
    597     List.Add(Items[I]);
    598 end;
    599 
    600 procedure TImportSource.Process;
     604    List[I] := Items[I];
     605end;
     606
     607procedure TImportSource.Process(AcronymDb: TAcronymDb);
    601608begin
    602609  ItemCount := 0;
    603610  case Format.Kind of
    604     ifkParseURL: ProcessTextParseURL;
    605     ifkMSAccess: ProcessMSAccess;
    606     ifkParseFile: ProcessTextParseFile;
     611    ifkParseURL: ProcessTextParseURL(AcronymDb);
     612    ifkMSAccess: ProcessMSAccess(AcronymDb);
     613    ifkParseFile: ProcessTextParseFile(AcronymDb);
    607614    else raise Exception.Create(SUnsupportedImportFormat);
    608615  end;
     
    742749end;
    743750
     751procedure TImportSources.Assign(Source: TImportSources);
     752begin
     753
     754end;
     755
    744756function TImportSources.SearchByName(Name: string): TImportSource;
    745757var
     
    795807end;
    796808
     809procedure TImportFormats.Assign(Source: TImportFormats);
     810begin
     811
     812end;
     813
    797814procedure TImportFormats.UpdateIds;
    798815var
     
    856873{ TImportSource }
    857874
    858 procedure TImportSource.ProcessTextParseURL;
     875procedure TImportSource.ProcessTextParseURL(AcronymDb: TAcronymDb);
    859876var
    860877  S: string;
     
    867884    ResponseStream.Read(S[1], Length(S));
    868885
    869     TextParse(S);
    870   end;
    871 end;
    872 
    873 procedure TImportSource.ProcessTextParseFile;
     886    TextParse(AcronymDb, S);
     887  end;
     888end;
     889
     890procedure TImportSource.ProcessTextParseFile(AcronymDb: TAcronymDb);
    874891var
    875892  S: TStringList;
     
    879896    try
    880897      S.LoadFromFile(URL);
    881       TextParse(S.Text);
     898      TextParse(AcronymDb, S.Text);
    882899    finally
    883900      S.Free;
     
    920937var
    921938  Node2: TDOMNode;
    922   I: Integer;
    923939begin
    924940  Name := ReadString(Node, 'Name', '');
     
    934950  if Assigned(Node2) then
    935951    Categories.LoadRefFromNode(Node2);
    936 
    937   // Add reverse references
    938   for I := 0 to Categories.Count - 1 do
    939     Categories[I].ImportSources.Add(Self);
    940952end;
    941953
     
    950962
    951963destructor TImportSource.Destroy;
    952 var
    953   I: Integer;
    954 begin
    955   for I := 0 to Categories.Count - 1 do
    956     Categories[I].ImportSources.Remove(Self);
     964begin
    957965  FreeAndNil(Categories);
    958966  FreeAndNil(ResponseStream);
     
    979987
    980988{ TAcronymMeanings }
     989
     990procedure TAcronymMeanings.Assign(Source: TAcronymMeanings);
     991begin
     992
     993end;
    981994
    982995procedure TAcronymMeanings.UpdateIds;
     
    10491062  Result := TAcronymMeaning.Create;
    10501063  Result.Name := Name;
     1064  Result.Acronym := Acronym;
    10511065  Add(Result);
    10521066end;
     
    10641078{ TAcronymMeaning }
    10651079
     1080procedure TAcronymMeaning.Assign(Source: TAcronymMeaning);
     1081begin
     1082  Name := Source.Name;
     1083  Description := Source.Description;
     1084  Language := Source.Language;
     1085  Categories.Assign(Source.Categories);
     1086  Sources.Assign(Source.Sources);
     1087end;
     1088
    10661089procedure TAcronymMeaning.MergeCategories(MergedCategories: TAcronymCategories);
    10671090var
     
    10711094  if Categories.IndexOf(MergedCategories[I]) = -1 then begin
    10721095    Categories.Add(MergedCategories[I]);
    1073     MergedCategories[I].AcronymMeanings.Add(Self);
    10741096  end;
    10751097end;
     
    10951117var
    10961118  Node2: TDOMNode;
    1097   I: Integer;
    10981119begin
    10991120  Name := ReadString(Node, 'Name', '');
     
    11051126  if Assigned(Node2) then begin
    11061127    Categories.LoadRefFromNode(Node2);
    1107 
    1108     // Add reverse references
    1109     for I := 0 to Categories.Count - 1 do
    1110       Categories[I].AcronymMeanings.Add(Self);
    11111128  end;
    11121129
     
    11251142
    11261143destructor TAcronymMeaning.Destroy;
    1127 var
    1128   I: Integer;
    1129 begin
    1130   for I := 0 to Categories.Count - 1 do
    1131     Categories[I].AcronymMeanings.Remove(Self);
     1144begin
    11321145  FreeAndNil(Categories);
    11331146  FreeAndNil(Sources);
     
    11361149
    11371150{ TAcronyms }
     1151
     1152procedure TAcronyms.Assign(Source: TAcronyms);
     1153begin
     1154
     1155end;
    11381156
    11391157procedure TAcronyms.SaveToNode(Node: TDOMNode);
     
    11841202  Result := TAcronym.Create;
    11851203  Result.Name := Name;
     1204  Result.Db := Db;
    11861205  Add(Result);
    11871206end;
     
    11991218    if Items[I].Id > LastId then LastId := Items[I].Id;
    12001219  end;
     1220
    12011221  // Add ID to new items without ID
    12021222  for I := 0 to Count - 1 do begin
     
    12311251  while Assigned(Node2) and (Node2.NodeName = 'Category') do begin
    12321252    NewItem := TAcronymCategory.Create;
     1253    NewItem.AcronymDb := Db;
    12331254    NewItem.LoadFromNode(Node2);
    12341255    Add(NewItem);
     
    12591280  while Assigned(Node2) and (Node2.NodeName = 'Ref') do begin
    12601281    if TryStrToInt(string(Node2.TextContent), Id) then begin
    1261       Category := Db.Categories.SearchById(Id);
    1262       if Assigned(Category) then begin
    1263         Add(Category);
     1282      Category := SearchById(Id);
     1283      if not Assigned(Category) then begin
     1284        Category := Db.Categories.SearchById(Id);
     1285        if Assigned(Category) then begin
     1286          Add(Category);
     1287        end;
    12641288      end;
    12651289    end;
     
    13341358  I: Integer;
    13351359begin
    1336   List.Clear;
     1360  List.Count := Count;
    13371361  for I := 0 to Count - 1 do
    1338     List.Add(Items[I]);
     1362    List[I] := Items[I];
    13391363end;
    13401364
     
    13471371  for I := 0 to Source.Count - 1 do begin
    13481372    NewCategory := TAcronymCategory.Create;
     1373    NewCategory.AcronymDb := Db;
    13491374    NewCategory.Assign(Source[I]);
    13501375    Add(NewCategory);
     
    13601385    Result := Result + Items[I].Name + ',';
    13611386  System.Delete(Result, Length(Result), 1);
    1362 end;
    1363 
    1364 procedure TAcronymCategories.UpdateLinkImportSources(Item: TImportSource);
    1365 var
    1366   I: Integer;
    1367 begin
    1368   for I := 0 to Count - 1 do
    1369     if Items[I].ImportSources.IndexOf(Item) = -1 then
    1370       Items[I].ImportSources.Add(Item);
    1371 end;
    1372 
    1373 procedure TAcronymCategories.UpdateLinkAcronymMeanings(Item: TAcronymMeaning);
    1374 var
    1375   I: Integer;
    1376 begin
    1377   for I := 0 to Count - 1 do
    1378     if Items[I].AcronymMeanings.IndexOf(Item) = -1 then
    1379       Items[I].AcronymMeanings.Add(Item);
    13801387end;
    13811388
     
    13941401{ TAcronym }
    13951402
     1403procedure TAcronym.Assign(Source: TAcronym);
     1404begin
     1405  Name := Source.Name;
     1406  Meanings.Assign(Source.Meanings);
     1407end;
     1408
    13961409procedure TAcronym.SaveToNode(Node: TDOMNode);
    13971410var
     
    14301443{ TAcronymCategory }
    14311444
     1445function TAcronymCategory.GetAcronymMeanings: TAcronymMeanings;
     1446var
     1447  I: Integer;
     1448  J: Integer;
     1449begin
     1450  Result := TAcronymMeanings.Create(False);
     1451  for I := 0 to AcronymDb.Acronyms.Count - 1 do
     1452  with AcronymDb.Acronyms[I] do begin
     1453    for J := 0 to Meanings.Count - 1 do
     1454    with Meanings[J] do
     1455    if Assigned(Categories.SearchById(Self.Id)) then
     1456      Result.Add(Meanings[J]);
     1457  end;
     1458end;
     1459
     1460function TAcronymCategory.GetAcronymMeaningsCount: Integer;
     1461var
     1462  I: Integer;
     1463  J: Integer;
     1464begin
     1465  Result := 0;
     1466  for I := 0 to AcronymDb.Acronyms.Count - 1 do
     1467  with AcronymDb.Acronyms[I] do begin
     1468    for J := 0 to Meanings.Count - 1 do
     1469    with Meanings[J] do
     1470    if Assigned(Categories.SearchById(Self.Id)) then
     1471      Inc(Result);
     1472  end;
     1473end;
     1474
     1475function TAcronymCategory.GetImportSources: TImportSources;
     1476var
     1477  I: Integer;
     1478begin
     1479  Result := TImportSources.Create(False);
     1480  for I := 0 to AcronymDb.ImportSources.Count - 1 do
     1481  with AcronymDb.ImportSources[I] do
     1482  if Assigned(Categories.SearchById(Self.Id)) then
     1483    Result.Add(AcronymDb.ImportSources[I]);
     1484end;
     1485
     1486function TAcronymCategory.GetImportSourcesCount: Integer;
     1487var
     1488  I: Integer;
     1489begin
     1490  Result := 0;
     1491  for I := 0 to AcronymDb.ImportSources.Count - 1 do
     1492  with AcronymDb.ImportSources[I] do
     1493  if Assigned(Categories.SearchById(Self.Id)) then
     1494    Inc(Result);
     1495end;
     1496
    14321497procedure TAcronymCategory.Assign(Source: TAcronymCategory);
    14331498begin
    14341499  Id := Source.Id;
    14351500  Name := Source.Name;
    1436   // AcronymMeanings.Assign(Source.AcronymMeanings);
    1437   // ImportSources.Assign(Source.ImportSources);
    14381501  Enabled := Source.Enabled;
    14391502end;
     
    14581521  Name := '';
    14591522  Enabled := True;
    1460   AcronymMeanings := TAcronymMeanings.Create(False);
    1461   ImportSources := TImportSources.Create(False);
    1462 end;
    1463 
    1464 destructor TAcronymCategory.Destroy;
    1465 var
    1466   I: Integer;
    1467 begin
    1468   for I := 0 to AcronymMeanings.Count - 1 do
    1469     AcronymMeanings[I].Categories.Remove(Self);
    1470   FreeAndNil(AcronymMeanings);
    1471   for I := 0 to ImportSources.Count - 1 do
    1472     ImportSources[I].Categories.Remove(Self);
    1473   FreeAndNil(ImportSources);
    1474   inherited;
    14751523end;
    14761524
     
    14981546  FreeAndNil(Categories);
    14991547  inherited;
     1548end;
     1549
     1550procedure TAcronymDb.Assign(Source: TAcronymDb);
     1551begin
     1552  Modified := Source.Modified;
     1553  AddedCount := Source.AddedCount;
     1554  FileName := Source.FileName;
     1555  Categories.Assign(Source.Categories);
     1556  Acronyms.Assign(Source.Acronyms);
     1557  ImportFormats.Assign(Source.ImportFormats);
     1558  ImportSources.Assign(Source.ImportSources);
    15001559end;
    15011560
     
    16241683        end;
    16251684        NewMeaning.Categories.Add(AcronymCategory);
    1626         AcronymCategory.AcronymMeanings.Add(NewMeaning);
    16271685      end;
    16281686    end;
     
    17091767  if not Assigned(Acronym) then begin
    17101768    Acronym := TAcronym.Create;
     1769    Acronym.Db := Self;
    17111770    Acronym.Name := AcronymName;
    17121771    Acronyms.Add(Acronym);
Note: See TracChangeset for help on using the changeset viewer.