출처 : 델마당 - 라즈베리 파이(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에서 실행

 

저작자 표시
신고

FireMonkey - Canvas Free Drawing

Programming/Delphi - FireMonkey 2014.05.14 10:05 Posted by 파란크리스마스

출처 : Delphi Firemonkey 개발자 모임

TestPG.7z

Code

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.Objects;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Single);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    FDownPos: TPointF;
    AMouseDownCheck: Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  FMX.Platform;

{$R *.fmx}

procedure TForm1.FormShow(Sender: TObject);
var
  ScreenScale: Single;
  ScreenSvc: IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenSvc)) then
  begin
    ScreenScale := ScreenSvc.GetScreenScale;
  end;

  Image1.Bitmap.Width := Round(Self.Width * ScreenScale);
  Image1.Bitmap.Height := Round(Self.Height * ScreenScale);
  Image1.Bitmap.Clear(TAlphaColorRec.White);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  FDownPos := PointF(X, Y);
  AMouseDownCheck := True;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
begin
  if AMouseDownCheck then
  begin
    with Image1.Bitmap.Canvas do
    begin
      BeginScene();
      Stroke.Color := TAlphaColors.Black;
      StrokeThickness := 2;
      DrawLine(FDownPos, PointF(X, Y), 1);
      EndScene;
    end;
    FDownPos := PointF(X, Y);
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  AMouseDownCheck := False;
end;

end.

 

신고

Delphi - Http POST call

Programming/Delphi 2013.11.29 10:18 Posted by 파란크리스마스

Delphi - Http POST call

DelphiHttpPostCall.7z

procedure TForm1.Button1Click(Sender: TObject);
var
  sl : TStringList;
  ResponseStream: TMemoryStream;
  resultBytes: TBytes;
begin
  sl := TStringList.Create;
  ResponseStream := TStringStream.Create;
  try
    IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
    sl.Add('id=' + Edit2.Text);
    IdHTTP1.Post(Edit1.Text, sl, ResponseStream);
    ResponseStream.Position := 0;

    SetLength(resultBytes, ResponseStream.Size);
    ResponseStream.ReadBuffer(resultBytes[0], Length(resultBytes));

    Memo1.Lines.Text := TEncoding.UTF8.GetString(resultBytes);
  finally
    sl.Free;
    ResponseStream.Free;
  end;
end;
신고
TAG Delphi, HTTP, post

Delphi Tip

Programming/Delphi 2012.04.13 10:41 Posted by 파란크리스마스

출처

http://rainflys.tistory.com/84
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=del_qna&no=3570
http://bloodguy.tistory.com/entry/Delphi-바탕화면-시작메뉴프로그램-등-특수-디렉토리-가져오기

현재 실행 폴더 구하기

runpath:=ExtractFilePath(Application.ExeName);

Memo 스크롤 마지막으로 이동

procedure TForm1.Memo1Change(Sender: TObject);
begin
  Memo1.Perform(EM_LINESCROLL, 0, Memo1.Lines.Count);
end;

Format

 format('%0.10d',[10])

시스템 폴더 조회

// 시작 메뉴\프로그램 (C:\Documents and Settings\USER_NAME\시작 메뉴\프로그램)
SHGetFolderPath(0, CSIDL_PROGRAMS, 0, 0, PathPrograms);   
 
// 바탕 화면 (C:\Documents and Settings\USER_NAME\바탕 화면)
SHGetFolderPath(0, CSIDL_DESKTOP, 0, 0, PathDesktop);
unit Winapi.ShlObj;

  CSIDL_DESKTOP                 = $0000;          // 바탕화명 <desktop>
  CSIDL_INTERNET                = $0001;          // Internet Explorer (icon on desktop)
  CSIDL_PROGRAMS                = $0002;          //  시작메뉴\프로그램 Start Menu\Programs
  CSIDL_CONTROLS                = $0003;          // My Computer\Control Panel
  CSIDL_PRINTERS                = $0004;          // My Computer\Printers
  CSIDL_PERSONAL                = $0005;          // My Documents
  CSIDL_FAVORITES               = $0006;          // <user name>\Favorites
  CSIDL_STARTUP                 = $0007;          // Start Menu\Programs\Startup
  CSIDL_RECENT                  = $0008;          // <user name>\Recent
  CSIDL_SENDTO                  = $0009;          // <user name>\SendTo
  CSIDL_BITBUCKET               = $000a;          // <desktop>\Recycle Bin
  CSIDL_STARTMENU               = $000b;          // <user name>\Start Menu
  CSIDL_MYDOCUMENTS             = CSIDL_PERSONAL; // Personal was just a silly name for My Documents
  CSIDL_MYMUSIC                 = $000d;          // "My Music" folder
  CSIDL_MYVIDEO                 = $000e;          // "My Videos" folder
  CSIDL_DESKTOPDIRECTORY        = $0010;          // <user name>\Desktop
  CSIDL_DRIVES                  = $0011;          // My Computer
  CSIDL_NETWORK                 = $0012;          // Network Neighborhood (My Network Places)
  CSIDL_NETHOOD                 = $0013;          // <user name>\nethood
  CSIDL_FONTS                   = $0014;          // windows\fonts
  CSIDL_TEMPLATES               = $0015;

  CSIDL_COMMON_STARTMENU        = $0016;          // All Users\Start Menu
  CSIDL_COMMON_PROGRAMS         = $0017;          // All Users\Start Menu\Programs
  CSIDL_COMMON_STARTUP          = $0018;          // All Users\Startup
  CSIDL_COMMON_DESKTOPDIRECTORY = $0019;          // All Users\Desktop
  CSIDL_APPDATA                 = $001a;          // <user name>\Application Data
  CSIDL_PRINTHOOD               = $001b;          // <user name>\PrintHood
  CSIDL_LOCAL_APPDATA           = $001c;          // <user name>\Local Settings\Applicaiton Data (non roaming)
  CSIDL_ALTSTARTUP              = $001d;          // non localized startup
  CSIDL_COMMON_ALTSTARTUP       = $001e;          // non localized common startup
  CSIDL_COMMON_FAVORITES        = $001f;
  CSIDL_INTERNET_CACHE          = $0020;
  CSIDL_COOKIES                 = $0021;
  CSIDL_HISTORY                 = $0022;
  CSIDL_COMMON_APPDATA          = $0023;          // All Users\Application Data
  CSIDL_WINDOWS                 = $0024;          // GetWindowsDirectory()
  CSIDL_SYSTEM                  = $0025;          // GetSystemDirectory()
  CSIDL_PROGRAM_FILES           = $0026;          // C:\Program Files
  CSIDL_MYPICTURES              = $0027;          // C:\Program Files\My Pictures
  CSIDL_PROFILE                 = $0028;          // USERPROFILE
  CSIDL_SYSTEMX86               = $0029;          // x86 system directory on RISC
  CSIDL_PROGRAM_FILESX86        = $002a;          // x86 C:\Program Files on RISC
  CSIDL_PROGRAM_FILES_COMMON    = $002b;          // C:\Program Files\Common
  CSIDL_PROGRAM_FILES_COMMONX86 = $002c;          // x86 Program Files\Common on RISC
  CSIDL_COMMON_TEMPLATES        = $002d;          // All Users\Templates
  CSIDL_COMMON_DOCUMENTS        = $002e;          // All Users\Documents
  CSIDL_COMMON_ADMINTOOLS       = $002f;          // All Users\Start Menu\Programs\Administrative Tools
  CSIDL_ADMINTOOLS              = $0030;          // <user name>\Start Menu\Programs\Administrative Tools
  CSIDL_CONNECTIONS             = $0031;          // Network and Dial-up Connections
  CSIDL_COMMON_MUSIC            = $0035;          // All Users\My Music
  CSIDL_COMMON_PICTURES         = $0036;          // All Users\My Pictures
  CSIDL_COMMON_VIDEO            = $0037;          // All Users\My Video
  CSIDL_RESOURCES               = $0038;          // Resource Direcotry
  CSIDL_RESOURCES_LOCALIZED     = $0039;          // Localized Resource Direcotry
  CSIDL_COMMON_OEM_LINKS        = $003a;          // Links to All Users OEM specific apps
  CSIDL_CDBURN_AREA             = $003b;          // USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning

  // unused                               0x003c
  CSIDL_COMPUTERSNEARME         = $003d;          // Computers Near Me (computered from Workgroup membership)
  CSIDL_FLAG_CREATE             = $8000;          // combine with CSIDL_ value to force folder creation in SHGetFolderPath()
  CSIDL_FLAG_DONT_VERIFY        = $4000;          // combine with CSIDL_ value to return an unverified folder path
  CSIDL_FLAG_DONT_UNEXPAND      = $2000;          // combine with CSIDL_ value to avoid unexpanding environment variables
  CSIDL_FLAG_NO_ALIAS           = $1000;          // combine with CSIDL_ value to insure non-alias versions of the pidl
  CSIDL_FLAG_PER_USER_INIT      = $0800;          // combine with CSIDL_ value to indicate per-user init (eg. upgrade)
  CSIDL_FLAG_MASK               = $FF00;          // mask for all possible flag values

파일 경로 얻어오기

path := ExtractFilePath(Application.exeName);

- end -

신고
TClientDataset 데이터를 XML로 가지고 왔지만,
일본어에 표현에 문제가 발견 되었다.

모든 문자열 데이터의 경우 fieldtype="string"로 사용했는데,
유니코드의 경우 fieldtype="string.uni" 라고
표현해야 TWideStringField로 인식하여 올바르게 데이터가 표현되지만,
영문만 있는경우 또 다시 문제가 발견되었다.

영문만 존재하는 경우 데이터를 모두 확인하여 fieldtype="string"로 했지만,
이것도 임시 방편일뿐 완벽한 처리는 되는 않는다.

TClientDataset 자체의 버그라고 생각되지만, 우선은 이렇게 처리 해두었다.

------------------------------------------------------------------------
FastReport 에도 다국어를 위해서 처리 해야 하는 문제가 발견되었다.
TfrxMemoView 속성에서 UseDefaultCharset 값을 True로 해야 일본어가 올바르게 표시 되었다.

관련 소스 위치

procedure TfrxCustomMemoView.GetData;
var
  i, j: Integer;
  s, s1, s2, dc1, dc2: WideString;
  ThLocale: Cardinal;
  LocCharset: Boolean;
begin
  inherited;
  ThLocale := 0;
  LocCharset := ((Font.Charset <> DEFAULT_CHARSET) and  not FUseDefaultCharset);
  if IsDataField then
  begin
    if DataSet.IsBlobField(DataField) then
    begin
      if LocCharset then
      begin
        ThLocale := GetThreadLocale;
        SetThreadLocale(GetLocalByCharSet(Font.Charset));
      end;
        DataSet.AssignBlobTo(DataField, FMemo);
      if LocCharset then
        SetThreadLocale(ThLocale);
    end
    else
    begin
      FValue := DataSet.Value[DataField];
      if FDisplayFormat.Kind = fkText then
      begin
        if LocCharset then
          FMemo.Text := AnsiToUnicode(AnsiString(DataSet.DisplayText[DataField]), Font.Charset)
     else

       FMemo.Text := DataSet.DisplayText[DataField];

      end
      else FMemo.Text := FormatData(FValue);
      if FHideZeros and (TVarData(FValue).VType <> varString) and
      {$IFDEF Delphi12}(TVarData(FValue).VType <> varUString) and{$ENDIF}
        (TVarData(FValue).VType <> varOleStr) and (FValue = 0) then
        FMemo.Text := '';
    end;
  end
신고

XLSReadWriteII4 : 몇 가지 설정

Programming/Delphi 2011.11.13 15:35 Posted by 파란크리스마스
행추가
ws.InsertRows(row+1, 1);

행삭제
ws.DeleteRows(row, row+4);

셀병합
ws.MergeCells(1, p_row, 1, row-1);

테두리     
ws.Range.ItemsRef['A'+inttostr(2)+':'+'A'+inttostr(row)].BorderOutlineStyle := cbsThin; // cbsHair;

가운데 설정
ws.Cell[9, row].HorizAlignment := chaCenter;

몇 가지 설정
ws.Cell[i, row].NumberFormat := '_-* #,##0_-;-* #,##0_-;_-* ""-""_-;_-@_-';
ws.Cell[9, row].NumberFormat := '0%';

셀높이 설정
ws.Rows[(i*28)+2].Height := ws.Rows[2].Height;

셀복사
XLS01.CopyCells(SheetIndex, 0,0,7,27, SheetIndex, 0,(i*28));

출력 설정
XLS01.Sheet[SheetIndex].PrintSettings.Options := [psoHorizCenter];
XLS01.Sheet[SheetIndex].PrintSettings.HorizPagebreaks.Clear;
//
HorizPagebreak := ws.PrintSettings.HorizPagebreaks.Add;
HorizPagebreak.Row := (loopRow*28)+addRow-tmpAddRow-1;

배경색 지정

function RGBToColor(R,G,B:Byte): TColor;
begin
Result:=B Shl 16 Or
G Shl 8 Or
R;
end;

color := RGBToColor(255,255,0)
ws.Range.ItemsRef['A'+IntToStr(row)+':'+GetRowStr(col)+IntToStr(row)].FillPatternForeColor := TColorToClosestXColor(color);
신고

Delphi tip - 시스템 임시 폴더 구하기

Programming/Delphi 2011.02.19 14:22 Posted by 파란크리스마스
출처 : http://www.delphitricks.com/source-code/systeminfo/get_windows_system_temporary_directory.html

{ Getting the Temporary Directory } 

function GetTempDir: string; 
var 
  Buffer: array[0..MAX_PATH] of Char; 
begin 
  GetTempPath(SizeOf(Buffer) - 1, Buffer); 
  Result := StrPas(Buffer); 
end; 

function GetTempPath: string; 
var 
  TmpDir: PChar; 
begin 
  TmpDir := StrAlloc(MAX_PATH); 
  GetTempPath(TmpDir, MAX_PATH); 
  Result := string(TmpDir); 
  if Result[Length(Result)] <> '\' then 
    Result := Result + '\'; 
  StrDispose(TmpDir); 
end; 

function GetTempPath(var S: String): Boolean; 
var 
  Len: Integer; 
begin 
  Len := Windows.GetTempPath(0, nil); 
  if Len > 0 then 
  begin 
    SetLength(S, Len); 
    Len := Windows.GetTempPath(Len, PChar(S)); 
    SetLength(S, Len); 
    Result := Len > 0; 
  end else 
    Result := False; 
end; 
신고

Delphi - TcxVirtualTreeList

Programming/Delphi 2010.12.05 00:49 Posted by 파란크리스마스
- CustomDataSource 사용시 동적인 Count 사용
OptionsData.SmartLoad := True;

- 트리노드의 초기 + 표시
OptionsData.CheckHasChildren := false;
신고

Delphi Tip - 숫자 여부 확인

Programming/Delphi 2010.05.18 17:52 Posted by 파란크리스마스
Delphi에서 StrToInt을 하는 경우 Exception 발생하는데, Debug 시에는 귀찮을 때가 있어
Tip을 올립니다.

SysUtil.pas의 StrToInt 내부를 보면,
Var 함수를 사용하고 있는데, 3번째 인자의 값이 0이 아니면 Exception을 발생하도록 되어 있습니다.

function StrToInt(const S: string): Integer;
var
  E: Integer;
begin
  Val(S, Result, E);
  if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
end;

사용예)
아래의 예를 보시면 Result 값을 0으로 초기화 하고
Var의 3번째 인자의 값이 0이면 Result에 값에 담아서 반환하도록 했습니다.

function StrToInt2(const S: string): Integer;
var
  intTemp, E : Integer;
begin
  Result := 0;
  // 숫자 여부 확인
  Val(S, intTemp , E);
  if E=0 then
    Result := intTemp ;
end
신고

Delphi Tip - 디렉토리 문자열 분리

Programming/Delphi 2010.04.04 06:31 Posted by 파란크리스마스


uses
  StrUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  tmpDirStr : String;
  offset : integer;

  function GetFindStr(SubFindStr : String; var offset : integer):string;
  var
    offsetOld, offset2 : integer;
  begin
    Result := '';

    offset2 := 0;
    if SubFindStr[offset] = '/' then
      inc(offset2);

    offsetOld := offset;
    offset := PosEx('/', SubFindStr, offset + offset2);

    if offset>0 then begin
      Result := MidStr(SubFindStr, offsetOld + offset2, offset-offsetOld-offset2);
    end;
  end;

begin
  tmpDirStr := Edit1.Text;

  if (tmpDirStr[Length(tmpDirStr)]<>'/') then
    tmpDirStr := tmpDirStr + '/';

  offset := 1;

  while (offset > 0) do begin
    Memo1.Lines.Add(GetFindStr(tmpDirStr, offset));
  end;
end;

신고

Delphi - 열거형 타입 ( Delphi enum type )

Programming/Delphi 2010.03.04 11:25 Posted by 파란크리스마스

type
  TDatabaseType
    = (dbtMSSQL, dbtOracle, dbtCUBRID, dbtSybase, dbtNone);

  TDatabaseSet = set of TDatabaseType;

const
  StrDatabaseNames : array[TDatabaseType] of String
    = ('MSSQL', 'Oracle', 'CUBRID', 'Sybase', 'None');

 함수  내용
 Typeinfo  열거형의 형정보(TypeInfo)에 대한 포인터 반환
 GetEnumName  열거형의 각 멤버를 문자열로 반환
 GetEnumValue  
 Ord  
 Pred  
 Succ  
 Dec  
 Inc  
 Low  


procedure TForm1.Button1Click(Sender: TObject);
var
  DatabaseType : TDatabaseType;
begin
  // GetEnumValue : String to Enum
  DatabaseType := TDatabaseType(GetEnumValue(TypeInfo(TDatabaseType), 'dbtOracle'));

  // GetEnumName : Enum to String
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtOracle

  // Ord
  ShowMessage(IntToStr(Ord(dbtOracle))); // 1

  // Dec
  Dec(DatabaseType);
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtMSSQL

  // Inc
  Inc(DatabaseType);
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtOracle

  // Low, High / Loop
  for DatabaseType := Low(TDatabaseType) to High(TDatabaseType) do
    ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType)));
end;

Delphi Set배열

uses
  TypInfo;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : TDBObjectType;
begin
  for i in UniSQLObjectSet[DBVer_CUBRID] do begin
    Memo1.Lines.Add('i=' + GetEnumName ( TypeInfo ( TDBObjectType ), Ord(i) ) );
  end;

end;

- end -

신고

Delphi Tip 로케일(Locale) 확인 하기

Programming/Delphi 2010.01.20 10:48 Posted by 파란크리스마스

원본 사이트 : http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_10231553.html

procedure TForm1.Button1Click(Sender: TObject);

  function GetLocale(ALcid: Integer): string;
  var s: string;
  begin
    Result := '[Unknown]';
    SetLength(s, 128);
    if GetLocaleInfo(ALcid, LOCALE_SENGLANGUAGE, PChar(s), 128) > 0 then
      begin
        Result := StrPas(PChar(s));
        if GetLocaleInfo(ALcid, LOCALE_SENGCOUNTRY, PChar(s), 128) > 0 then
          begin
            Result := Format('%s (%s)', [Result, StrPas(PChar(s))]);
          end;
      end;
  end;

begin
  showmessage(GetLocale(GetUserDefaultLangID));
end;

더보기


 

신고


 

티스토리 툴바