728x90

출처 : 엑셀(Excel) 개발도구 탭 추가하기 (리본메뉴에 개발도구 탭 표시)

Sub Hello()

    Dim Sht As Worksheet
    Dim iRow As Integer
    
    For Each Sht In Worksheets
        'Sht.Cells.WrapText = True
        If Sht.Index >= 3 Then
            'MsgBox (Sht.Name)
            Sht.Select
            MsgBox (ActiveSheet.Name)
            For iRow = 7 To ActiveSheet.UsedRange.Rows.Count
            
                If Sht.Cells(iRow, 1) = "마지막행" Then
                    Exit For
                End If
                
                ' 가운데 정렬
                With Sht.Cells(iRow, 6)
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                End With
                With Sht.Cells(iRow, 7)
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                End With
                
                Sht.Cells(iRow, 2).Select
                
                
                ' 노락색 인경우 = 6
                If ActiveCell.Interior.ColorIndex = 6 Then
                    ' 회색으로 변경 = 15
                    Sht.Cells(iRow, 1).Interior.ColorIndex = 15
                    Sht.Cells(iRow, 2).Interior.ColorIndex = 15
                    Sht.Cells(iRow, 3).Interior.ColorIndex = 15
                    Sht.Cells(iRow, 4).Interior.ColorIndex = 15
                    Sht.Cells(iRow, 5).Interior.ColorIndex = 15
                    Sht.Cells(iRow, 6).Interior.ColorIndex = 15
                    Sht.Cells(iRow, 7).Interior.ColorIndex = 15
                    Sht.Cells(iRow, 8).Interior.ColorIndex = 15
                End If
                'MsgBox (Sht.Cells(iRow, 1))
            Next iRow
        End If
    Next Sht
End Sub



728x90
728x90

출처 : CT on MacOS X 10.11.x (El Capitan)
PilotLogic - MacOS - Detail Installation
PilotLogic - Setup Script Options

0. CodeTyphon 삭제 ( 기본에 설치되어 있는 경우)

$ cd /usr/local
$ sudo rm -Rf codetyphon

1. xcode 설치

2. xcode command tool 설치

$ xcode-select --install

3. XQuartz 설치

XQuartz 2.7.8 (For OS X 10.6.3 or later (including El Capitan) 다운로드

XQuartz 미설치 오류

4. MacPorts 설치

MacPorts OS X 10.11 El Capitan 다운로드

5. 사용자 sudo 권한 부여

$ sudo vi /etc/sudoers

내용추가 - bluesanta 사용자의 root권한 부여

bluesanta       ALL=(ALL) NOPASSWD: ALL

6. CodeTyphon 다운로드 및 설치

다운로드

설치 스크립트(install.sh) 실행

$ cd Downloads/CodeTyphonIns
$ ./install.sh
  
====================================================
             CodeTyphon Studio 
            Version 5.60 (GEN V)
   Installation for: Linux-Solaris-FreeBSD-MacOS
====================================================
 
WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.
 
To proceed, enter your password, or type Ctrl-C to abort.
 
Password:

CodeTyphon 설치

 
   0) Install CodeTyphon Studio
  
   9) Exit
  
>>> Select an action (press 0..9 key): 0

설치 스크립트 종료

====================================================
  CodeTyphon Studio 5.60 Setup for Darwin64
   Settings: Platform=carbon  Multiarch Mode=1
====================================================
   
   0) Install System Libraries
   1) Run CodeTyphon Center (CTC)
   
     11) -- Platform (widget) Setup
     12) -- Multi-Architecture Setup
   
   3) Remove FreePascal
   4) Remove and Build FreePascal
   
   5) Remove Typhon IDE
   6) Remove and Build Typhon IDE
   
   7) Remove ALL
   8) Remove and Build ALL
   
   9) EXIT
   
>>>  Select an action (press 0..9 key): 9

7. Install System Libraries


8. 모두(FPC, Typhon, COcean) 빌드 하기


// shryu

{$IFDEF FPC}

  type HWND = type THandle;

{$ENDIF}







728x90
728x90

출처 : 델마당 - 라즈베리 파이(Raspberry Pi) 보드 크로스 컴파일 환경 구축 성공(Win7 => 라즈베리)
Cross-Build for RasberryPi
TOPIC: How to build app for Raspberry Pi from Windows 7
Setup Cross Compile For ARM

Lazarus

Lazarus라는 RAD툴 입니다.
아직 설치 방법은 작성중이고, 우선 개발된 소스와 실행 파일을 올립니다.
기본언어는 Pascal 이고, 상용툴로 Delphi와 비슷합니다.
Raspberry PI용 화면개발을 하실 일이 있다면 편하게 작성하실수 있습니다.

설치방법과 GPIO관련 내용은 따로 작성해서 올리겠습니다.

GPIO 컴포넌트

rpi-hal 링크

CodeTyphon 다운로드

Cross-Build for RasberryPi 다운로드

설치

CodeTyphonIns\install.bat 관리자로 실행

Lazarus 실행

화면디자인

소스코드 Unit1.pas project1.zip

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  //
  Edit1.Text := 'Hello Raspberry !!!';
end;

end.

Windows에서 실행

 

Raspberry PI 용 컴파일 옵션 설정

Raspberry PI에서 실행

 

728x90
728x90

출처 : jQuery select box 관련 api

동적으로 Option 추가

$.each(result.data.list, function(index, data)
{
	try {
		var row = $('#row_item').clone();
		row.appendTo('.uio_text');
						
		// JQuery에서 Select에 추가
		var findItem = $("select[name='item_list'] option[value='"+data.tml+"']");
		if (data.tml!=undefined && $("select[name='item_list'] option").index(findItem)<0) {
			$("select[name='item_list']").append("<option value='"+data.tml+"'>"+data.tml+"</option>");
		}
	} catch(err) {
		alert(err.message);
	}
});

선택된 Value 구하기

var item_id = $("select[name='item_list'] option:selected").val();

선택된 Index 구하기

var index = $("select[name='item_list'] option").index($("select[name='item_id'] option:selected"));

Value값으로 Index 구하기

var index = $("select[name='item_list'] option").index($("select[name='item_list'] option[value='value1']"));

Text값으로 Index 구하기

	// 방법1
	/*
	$('select[name="space_id"] option').filter(function() { 
		return $.trim( $(this).text() ) == '${ho_info.ho_line}'; 
	}).attr('selected','selected');
	*/
	
	var index = -1;
	$("select[name='space_id'] option").each(function () {
		if ($(this).html() == '${ho_info.ho_line}') {
			$(this).prop("selected", "selected");
			index = $(this).index();
			return;
		}
	});
	
	if (index>=0) {
		$("#lbl_selected_space").attr('class','label').css('color', 'black');
	} else {
		$("#lbl_selected_space").show();
		$("select[name='space_id'] option:eq(0)").attr("selected", "selected");
	}

개수 구히기

var count = $("select[name='item_list'] option").size();


728x90
728x90

출처 : JAXB(위키백과)
@XMLAccessorType, @XMLRootElement
JAXB 2.0 Annotation 정리
How to customise an XML export using JAXB
Creating a Generic List Wrapper in JAXB

JAXB(Java Architecture for XML Binding)는 자바 클래스를 XML로 표현하는 자바 API이다. JAXB는 주로 2가지 기능이 있다. 자바 객체를 XML로 직렬화하는 것이고 반대로 XML에서 자바 객체로 역직렬화하는 것이다. 즉, JAXB는 메모리의 데이터를 XML 형식으로 변환하여 저장할 수 있고, 이 과정을 위해 프로그램의 각 클래스에서 XML을 읽고 저장하는 일을 구현해야 한다.

JAXB 2.0 Annotation 정리

@XmlRootElement 속성

  • name : xml root element 명 지정
  • namespace: namespace 지정

@XmlAccessorType의 설정

@XmlAccessorType(XmlAccessType.PROPERTY)

  • 모든 getter/setter 쌍을 JAXB 직렬화/역직렬화 대상으로 함
  • JAXB 직력화/역직력화에서 제외하고자 할 경우 getter 혹은 setter에 @XmlTransient를 사용
  • @XmlTransient는 getter/setter 상단에 설정
    • 멤버변수 상단에 설정시 적용 않됨
  • getter/setter가 존재하지 않는 public 멤버 변수를 JAXB 직력화/역직력화에서 추가하고자 할 경우 JAXB 어노테이션 사용
    • @XmlElement
    • @XmlAttribute

Employee

package com.test;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "Emp")
@XmlType(propOrder = {"name", "age", "role", "gender"})
public class Employee {

	private int id;

	private String gender;

	private int age;
	private String name;
	private String role;

	private String password;

	@XmlTransient
	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@XmlAttribute
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@XmlElement(name = "gen")
	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	@Override
	public String toString() {
		return "ID = " + id + " NAME=" + name + " AGE=" + age + " GENDER="
				+ gender + " ROLE=" + role + " PASSWORD=" + password;
	}

}

JAXBExample

package com.test;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JAXBExample {

	private static final String FILE_NAME = "jaxb-emp.xml";

	public static void main(String[] args) {
		Employee emp = new Employee();
		emp.setId(1);
		emp.setAge(25);
		emp.setName("Pankaj");
		emp.setGender("Male");
		emp.setRole("Developer");
		emp.setPassword("sensitive");

		jaxbObjectToXML(emp);

		Employee empFromFile = jaxbXMLToObject();
		System.out.println(empFromFile.toString());
	}

	private static Employee jaxbXMLToObject() {
		try {
			JAXBContext context = JAXBContext.newInstance(Employee.class);
			Unmarshaller un = context.createUnmarshaller();
			Employee emp = (Employee) un.unmarshal(new File(FILE_NAME));
			return emp;
		} catch (JAXBException e) {
			e.printStackTrace();
		}
		return null;
	}

	private static void jaxbObjectToXML(Employee emp) {

		try {
			JAXBContext context = JAXBContext.newInstance(Employee.class);
			Marshaller m = context.createMarshaller();
			// for pretty-print XML in JAXB
			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

			// Write to System.out for debugging
			// m.marshal(emp, System.out);

			// Write to File
			m.marshal(emp, new File(FILE_NAME));
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}

}

결과 파일 : jaxb-emp.xml

JAXBExample에서 Employee 클래스에 데이터를 담고, 그것을 xml로 출력한 결과입니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Emp id="1">
    <name>Pankaj</name>
    <age>25</age>
    <role>Developer</role>
    <gen>Male</gen>
</Emp>

Wrapper

package com.test;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAnyElement;

public class Wrapper<T> {
	private List<T> items;

	public Wrapper() {
		items = new ArrayList<T>();
	}

	public Wrapper(List<T> items) {
		this.items = items;
	}

	@XmlAnyElement(lax = true)
	public List<T> getItems() {
		return items;
	}
}

XMLServlet

package com.test;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;

@WebServlet(urlPatterns = "/xml")
public class XMLServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/xml;charset=UTF-8");
		OutputStream out = resp.getOutputStream();

		try {
			JAXBContext jc = JAXBContext.newInstance(Wrapper.class, Employee.class);
			
			// Marshal
			Marshaller marshaller;
			
			marshaller = jc.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			marshal(marshaller, getEmpDatas(), "emps", out);

		} catch (JAXBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		out.close();
	}

	/** * Unmarshal XML to Wrapper and return List value. */
	private static <T> List<T> unmarshal(Unmarshaller unmarshaller, Class<T> clazz, String xmlLocation) throws JAXBException {
		StreamSource xml = new StreamSource(xmlLocation);
		Wrapper<T> wrapper = (Wrapper<T>) unmarshaller.unmarshal(xml, Wrapper.class).getValue();
		return wrapper.getItems();
	}

	/**
	 * * Wrap List in Wrapper, then leverage JAXBElement to supply root element *
	 * information.
	 */
	private static void marshal(Marshaller marshaller, List<?> list, String name, OutputStream os) throws JAXBException {
		QName qName = new QName(name);
		Wrapper wrapper = new Wrapper(list);
		JAXBElement<Wrapper> jaxbElement = new JAXBElement<Wrapper>(qName, Wrapper.class, wrapper);
		marshaller.marshal(jaxbElement, os);
	}

	private List<Employee> getEmpDatas() {

		List<Employee> datas = new ArrayList<Employee>();

		Employee emp = new Employee();
		emp.setId(1);
		emp.setAge(25);
		emp.setName("Pankaj");
		emp.setGender("Male");
		emp.setRole("Developer");
		emp.setPassword("sensitive");

		datas.add(emp);

		emp = new Employee();
		emp.setId(11);
		emp.setAge(125);
		emp.setName("1Pankaj");
		emp.setGender("1Male");
		emp.setRole("1Developer");
		emp.setPassword("1sensitive");

		datas.add(emp);

		return datas;
	}
}

실행결과

소스파일

ObjToXML.zip

728x90
728x90

출처 : FMXExpress/android-object-pascal-wrapper
Android JNI Bridge and Custom Classes.dex
Java2OP.exe, the Native Bridge File Generator for Android
파이어몽키에서 안드로이드 외부 라이브러리(jar 파일) 이용(Import jar)
델파이 파이어몽키 안드로이드 앱 내에 스플래시 스크린추가
Creating a splash screen for Delphi XE6 Android apps
Delphi XE6のAndroidアプリケ?ションで、Intentを使ってアクティビティを開始して?り値を取得するサンプル
android-file-dialog

안드로이드 TOpenDialog 구현

FireMonkey의 Android에서 TOpenDialog가 동작하지 않아 android-file-dialog를 이용해서 TOpenDialog처럼 파일를 선택 할 수 있도록 구현 해보았습니다.

android-file-dialog 파일을 받아서 컴파일 해서 jar로 묶고 FireMonkey 프로젝트를 만들고 jar를 추가했습니다.

XE7부터는 classes.dex로 만들지 않고, jar 형태의 라이브러리를 바로 추가 할수 있고, java2op 유틸리티로 브릿지 파일을 생성 할 수 있어서 편하게 안드로이드용 라이브러리 추가가 가능합니다.

안드로이드 브릿지 파일 생성

유틸리티 java2op로 안드로이드 브릿지 파일(Androidapi.JNI.Interfaces.pas)를 생성 합니다.

java2op -jar lib_fileexplorer.jar

라이브러리 jar 추가

   

AndroidManifest.template.xml 파일 수정

<!-- bluexmas -->
<activity android:name="com.lamerman.FileDialog"
          android:configChanges="orientation|keyboard" />

리소스 추가

메뉴 > Project > Deployment 선택

Activity 화면 전환

  Intent := TJIntent.JavaClass.init;
  Intent.setClassName(SharedActivityContext, StringToJString('com.lamerman.FileDialog'));
  SharedActivity.startActivityForResult(Intent, 0);

결과 메시지 받기

HandleActivityMessage 함수로 FileDialog Activity의 결과를 받아 오도록 등록

  FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage
    (TMessageResultNotification, HandleActivityMessage);

결과 처리

filename := JStringToString(Data.getStringExtra(StringToJString('RESULT_PATH')));
Edit1.Text := filename;

델파이 전체소스

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  Androidapi.JNI.Interfaces, System.Messaging,
  FMX.Platform.Android,
  Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    const ScanRequestCode = 0;
    var FMessageSubscriptionID: Integer;
    procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
    function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage);
begin
  if M is TMessageResultNotification then
    OnActivityResult(TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode,
      TMessageResultNotification(M).Value);
end;

function TForm1.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
var
  filename : string;
begin
  Result := False;

  TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID);
  FMessageSubscriptionID := 0;

  // For more info see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
  if RequestCode = ScanRequestCode then
  begin
    if ResultCode = TJActivity.JavaClass.RESULT_OK then
    begin
      if Assigned(Data) then
      begin
        filename := JStringToString(Data.getStringExtra(StringToJString('RESULT_PATH')));

        Edit1.Text := filename;

        //Toast(Format('Found %s format barcode:'#10'%s', [ScanFormat, ScanContent]), LongToast);
      end;
    end
    else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then
    begin
      //Toast('You cancelled the scan', ShortToast);
    end;
    Result := True;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Intent: JIntent; // JFileDialog;
begin
  FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage
    (TMessageResultNotification, HandleActivityMessage);

  Intent := TJIntent.JavaClass.init;
  Intent.setClassName(SharedActivityContext, StringToJString('com.lamerman.FileDialog'));
  SharedActivity.startActivityForResult(Intent, 0);
end;

end.

실행 

  

  

전체소스

FileExplorer.zip

 

728x90
728x90

출처 : CSS 선택자(Selector)의 종류 및 간단한 효과주기
CSS Selectors
Styling elements with a dot (.) in the class name

CSS 선택자

Pattern Meaning
#id id로 지정된 요소 선택
.class class로 지정된 요소 선택
E E 요소를 선택
E:link 방문하지 않은 E를 선택
E:visited 방문한 E를 선택
E:hover 마우스가 올라가 있는 동안 E를 선택
E:active 마우스 클릭 또는 키보드(enter)가 눌린 동안 E를 선택
E:focus focus가 머물러 있는 동안 E를 선택
E:first-line E 요소의 첫 번째 라인 선택
E:first-letter E 요소의 첫 번째 문자 선택
* 모든 요소 선택
E[foo] ‘foo’ 속성이 포함된 E를 선택
E[foo="bar"] ‘foo’ 속성의 값이 ’bar’와 일치하는 E를 선택
E[foo~="bar"] ‘foo’ 속성의 값에 ’bar’가 포함되는 E를 선택
E[foo|="en"] ‘foo’ 속성의 값이 ’en’ 또는 ’en-’ 으로 시작되는  E를 선택
E:first-child 첫 번째 자식 요소가 E라면 선택
E:lang(fr) HTML lang 속성의 값이 ’fr’로 지정된 E를 선택
E::before E 요소 전에 생성된 요소 선택
E::after E 요소 후에 생성된 요소 선택
E>F E 요소의 자식인 F 요소 선택
E+F E 요소를 뒤의 F 요소 선택
E[foo^="bar"] ‘foo’ 속성의 값이 ’bar’로 정확하게 시작하는 요소 선택
E[foo$="bar"] ‘foo’ 속성의 값이 ’bar’로 정확하게 끝나는 요소 선택
E[foo*="bar"] ‘foo’ 속성의 값에 ’bar’를 포함하는 요소 선택
E:root 문서의 최상위 루트 요소 선택
E:nth-child(n) 그 부모의 n번째 자식이 앞으로부터 지정된 순서와 일치하는 E 라면 선택
E:nth-last-child(n) n번째 자식이 뒤로부터 지정된 순서와 일치하는 요소가 E 라면 선택
E:nth-of-type(n) E 요소 중 앞으로부터 순서가 일치하는 n번째 E 요소 선택
E:nth-last-of-type(n) E 요소 중 끝으로부터 순서가 일치하는 n번째 E 요소 선택
E:last-child E 요소 중 마지막 자식이라면 E 선택
E:first-of-type E 요소 중 첫번째 E 선택
E:last-of-type E 요소 중 마지막 E 선택
E:only-child E 요소가 유일한 자식이면 선택
E:only-of-type E 요소가 같은 타입이면 선택
E:empty 텍스트 및 공백을 포함하여 빈 자식을 가진 E를 선택
E:target E의 URI의 대상이 되면 선택
E:enabled 활성화된 폼 컨트롤 E요소 선택
E:disabled 비활성화된 폼 컨트롤 E요소 선택
E:checked 선택된 폼 컨트롤(라디오버튼,체크박스)을 선택
E:not(s) s가 아닌 E 요소 선택
E~F E 요소가 앞에 존재하면 F를 선택

p 테그 class="center"

p.center {
    text-align: center;
    color: red;
}

<span class='a.b'>

.a\.b { }

 

728x90
728x90

출처 : Delphi - Http POST call
TStream.ReadBuffer Method
TEncoding.GetString Method (TBytes)

procedure TForm1.Button2Click(Sender: TObject);
var
  tmpBuffer, Buffer: TBytes;
  LFileStream: TFileStream;
  test : String;
begin
  //
  LFileStream := TFileStream.Create(Path + 'test.smi', fmOpenRead);

  try
    Memo1.Lines.BeginUpdate;

    // Read file into buffer
    SetLength(Buffer, LFileStream.Size);
    LFileStream.ReadBuffer(Buffer[0], Length(Buffer));

    SetLength(tmpBuffer, Length(Buffer)-2);
    CopyMemory(tmpBuffer, @Buffer[2], Length(Buffer)-2  );

    test := TEncoding.Unicode.GetString(Buffer);
    Memo1.Lines.Add(test);
  finally
    Memo1.Lines.EndUpdate;
    LFileStream.Free;
  end;
end;


728x90

+ Recent posts