Заполнение ImageList из GetTypeList

Автор l2qwe, 28.04.11, 16:02:30

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

l2qwe

Пробую заполнить ImageList
  DataSet: TClientDataSet;
  MemStream: TMemoryStream;
  image : TBitMap;
  bytes : TBytes;
...
    While Not DataSet.Eof do begin
        MemStream := TMemoryStream.Create;
        bytes := DataSet.FieldByName('_ICON').AsBytes; 
        MemStream.Position := 0;
        image.LoadFromStream(MemStream);
        index:=0;
        if NOT image.Empty then
          index := ImageList.Add(image,nil);
        MemStream.Free;
      DataSet.Next;
    end;

Но всегда получается что  image.Empty = true
Я так понимаю, что я не верно преобразовываю TBytes в TBitMap либо [_ICON] image - надо преобразовываются не в TBitMap ?

Chaa

Вы загружаете изображение из пустого потока.
Нужно как-то так:
Bytes := DataSet.FieldByName('_ICON').AsBytes;
LStream := TBytesStream.Create(Bytes);
try
    LBitmap := TBitmap.Create();
    try
        LBitmap.LoadFromStream(LStream);
        index := ImageList.AddMasked(LBitmap, LBitmap.TransparentColor);
    finally
        LBitmap.Free();
    end;
finally
    LStream.Free();
end;

l2qwe


l2qwe

Теперь пробую проделать то же самое в VS 2008 C#

            AppServer.SetFormat("xml", out lReturn, out lError);
            AppServer.ConnectToDBEx(nameDB, "", "", out lReturn, out lError);
            lsResult = AppServer.GetStateList(out lReturn, out lError).ToString();

            DataSet lDSv = new DataSet();
            System.Xml.XmlDocument lXmlDoc = new System.Xml.XmlDocument();
            lXmlDoc.LoadXml(lsResult);
            lDSv.ReadXml(new System.Xml.XmlNodeReader(lXmlDoc));
            foreach(DataRow lRow in lDSv.Tables[3].Rows)
            {               
                MemoryStream l_MmemString = new MemoryStream(System.Text.UnicodeEncoding.Default.GetBytes(lRow[2].ToString()));

                if (l_MemStream.Length > 0)
                    f_imageList.Images.Add(new Bitmap(l_MemStream));
                l_MemStream.Dispose();
            }

При выполнение на строке f_imageList.Images.Add(new Bitmap(l_MemStream)); выдаёт такое:
"Необработанное исключение типа "System.ArgumentException" произошло в System.Drawing.dll
Дополнительные сведения: Недопустимый параметр."

пробовал разные
System.Text.UnicodeEncoding.Default.GetBytes
System.Text.UTF32Encoding.Default.GetBytes
System.Text.UTF7Encoding.Default.GetBytes
System.Text.UTF8Encoding.Default.GetBytes
System.Text.ASCIIEncoding.Default.GetBytes

свойства f_imageList:
ColorDepth = Depth32Bit
ImageSize = 16; 16

PS в .NET еще совсем новичок

Chaa

Проблема скорее всего в том, что вы используете lRow[2].ToString(), а это не строка, а массив байт.
Попробуйте
byte[] columnValue = (byte[])lRow[2];
MemoryStream l_MmemString = new MemoryStream(columnValue);


l2qwe

Ругается
.
"Не удалось привести тип объекта "System.String" к типу "System.Byte[]""

В отладчике
Имя: lRow[2]   
Значение :
"Qk02BAAAAAAAADYAAAAoAAAAEAAAABAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA////
AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP///wAxWWsA////AP///wD///8A////AP///wD/
//8A////AP///wD///8A////AP///wD///8A////AP///wCEuu8AGDxKADFRewApRVIA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wBShrUAa6LOABgsOQAhQUIAKTRK
AClBYwAYNDkA////AP///wD///8A////AP///wD///8A////AP///wAhLEoASnmcAGui1gAIGDEA
GCgxAAgkGAAhMFIAECgxABAkMQAQJCkA////AP///wD///8A////AP///wBCbZwAITBCAEp1pQBz
qtYAAAQAABAoIQAQKCkAKTBSABAcKQAIFBgAABQYAP///wD///8A////AP///wApPDkAMV17ADE4
WgBKeZQAc6reAP///wAQLCEAECQxACE4WgAQGCkACBgYAAAIIQD///8A////AP///wD///8AKTxa
ADFZewApRUoAQnmcAFqStQApRVIAAAwIAAAUIQAhPFIAEBApABAYCAAYADEA////AP///wD///8A
////ACk8SgA5UYQAKUVjAEJZhACEx94AhMveAIS+3gBjmsYAAAAQAAgAAAAQCBAAEAAxAP///wD/
//8A////ACkEtQAhOFoAOVF7ABgkMQAYJJQAhMveAGuyzgBjmr0ACAgIAGuWvQA5aZwAITBKAAgA
IQD///8A////ACkEtQAICOcAEBSlACE0awApPK0AAAStABAYlAA5UWsA////AGOOzgBjhq0AQnGl
AEJttQAhPEIA////AP///wD///8AKQS1AAgI5wAIELUAAATGACE0pQAhLEIAWoKtAFJ9nAAhOEIA
ISxSACE4WgD///8A////AP///wD///8A////AP///wApBK0ACAjvABgEnAD///8AKU1rAEJplABK
ebUAKUVjAP///wD///8A////AP///wD///8A////AP///wApBLUACAjnACkEtQAABNYAQgSMAP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wApBLUACAj3ACkEtQD///8AKQS1
AAAE3gBKBJQA////AP///wD///8A////AP///wD///8A////AP///wD///8A////ACkEtQD///8A
////AP///wApBLUA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AA=="   
Тип : object {string}

C# распознаёт этот как текст. Скорее всего из за того, что я получаю данные от сервера приложений в формате xml и потом заполняю ДатаСет

Chaa

Судя по виду, данные упакованы в BASE64.
Попробуйте:
byte[] columnValue = System.Convert.FromBase64String((String)lRow[2]);

l2qwe

В очередной раз спасибо большое, работает.