XML i grafika

0

Jak do pliki XML dołączyć grafikę JPG lub BMP jako atrybut, a następnie go wczytać do programu?

0

możesz dołączyć jak atrybut ścieżkę do pliku graficznego i go wczytywać
ewentualnie zapisać obrazek jako BinaryStream...

0

bardziej interesuje mnie ta druga możliwość, tylko powiedz mi jeszcze jak mam to zrobić [???]

0

na pewno Image.Picture.Bitmap.SaveToStream() względnie Image.Picure.Bitmap.LoadFromSTream()

a także przydatne mogą być dwie funkcyjki które są w TXMLINI, a które wziąłem z oryginalnego TINIFIle. W nich jest to co ciebie interesuje, tj. zamiana odczytywanego stringa na TStream i odwrotnie (zapis TStream jako string)

Należy w nich tylko zmienić na jakiś sposób inny pobierania takstu z pliku XML i zapisywania do pliku i to będzie działało.

function TXMLIni.ReadBinaryStream(Section, Name: string;
  Value: TStream): integer;
var
  Text: string;
  Stream: TMemoryStream;
  Pos: Integer;
begin
  Text := ReadString(Section, Name, ''); {tutaj jest odczytywany tekst do zmiennej - po tym następuje zamiania - tutaj zmień}
  if Text <> '' then
  begin
    if Value is TMemoryStream then
      Stream := TMemoryStream(Value)
    else Stream := TMemoryStream.Create;
    try
      Pos := Stream.Position;
      Stream.SetSize(Stream.Size + Length(Text) div 2);
      HexToBin(PChar(Text), PChar(Integer(Stream.Memory) + Stream.Position), Length(Text) div 2);
      Stream.Position := Pos;
      if Value <> Stream then Value.CopyFrom(Stream, Length(Text) div 2);
      Result := Stream.Size - Pos;
    finally
      if Value <> Stream then Stream.Free;
    end;
  end else Result := 0;
end;

procedure TXMLIni.WriteBinaryStream(Section, Name: string; Value: TStream);
var
  Text: string;
  Stream: TMemoryStream;
begin
  SetLength(Text, (Value.Size - Value.Position) * 2);
  if Length(Text) > 0 then
  begin
    if Value is TMemoryStream then
      Stream := TMemoryStream(Value)
    else Stream := TMemoryStream.Create;
    try
      if Stream <> Value then
      begin
        Stream.CopyFrom(Value, Value.Size - Value.Position);
        Stream.Position := 0;
      end;
      BinToHex(PChar(Integer(Stream.Memory) + Stream.Position), PChar(Text),
        Stream.Size - Stream.Position);
    finally
      if Value <> Stream then Stream.Free;
    end;
  end;
  {tutaj podobnie, aczkolwiek string jest zapisywany do pliku. to tez zmień wedle swojego uznania}
  WriteString(Section, Name, Text);
end;

niestety nie wiem, czy te funkcje działają, ale nikt jeszce żadnego błędu na bugtraqa xmlini z nimi związanego nie zgłosił.

0

ok, dzięki. Przejrze te procedury i spróbuje dostosować do swoich potrzeb. Jeszcze raz dzięki [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1