본문 바로가기

삽질61

Flutter 상태관리: BLoC vs GetX 비교 1. 상태관리가 왜 필요한가?Flutter는 선언형 UI 프레임워크입니다.UI는 상태(State)의 함수로 표현되며, 상태가 바뀌면 위젯이 다시 빌드됩니다.UI = f(State)앱이 단순할 때는 setState()로 충분합니다. 하지만 다음과 같은 상황이 오면 한계에 부딪힙니다.여러 위젯이 같은 데이터를 공유해야 할 때비즈니스 로직이 UI 코드와 뒤섞일 때비동기 처리(API 호출, 스트림 등)가 복잡해질 때앱 규모가 커져 유지보수가 어려워질 때이 문제를 해결하는 방법이 상태관리 패턴이며,Flutter 생태계에서 가장 널리 쓰이는 두 가지 선택지가 BLoC과 GetX입니다. 2. BLoC 개요BLoC(Business Logic Component) 은 Google이 2018년 Google I/O에서 소개한.. 2026. 3. 24.
Flutter 설치하기 (mac, vscode) 다시 시작하려니 설치하는 방법을 까먹어서 정리.. git + 기본 툴 설치xcode-select --install Flutter SDK 설치https://docs.flutter.dev/install/quick+ 환경변수 설정# 환경변수 편집nano ~/.zshrc# 하단에 추가 (export PATH="$PATH:$HOME/Documents/flutter/bin" export ANDROID_HOME=$HOME/Library/Android/sdkexport PATH=$PATH:$ANDROID_HOME/emulatorexport PATH=$PATH:$ANDROID_HOME/platform-tools# 환경변수 적용source ~/.zshrc VS Code 설치https://code.visualstud.. 2026. 3. 24.
[Delphi] InnoSetup : 방화벽 추가 (netsh.exe) # WIN 7 이상 [Run] Filename: {sys}\netsh.exe; Parameters: "advfirewall firewall add rule name=""MyApp"" protocol=TCP dir=in program=""{app}\MyApp.exe"" action=allow localport=""8100,443"""; StatusMsg: "MyApp"; Flags: runhidden [UninstallRun] Filename: {sys}\netsh.exe; Parameters: "advfirewall firewall delete rule name=""MyApp"" program=""{app}\MyApp.exe"""; Flags: runhidden # WIN XP 이하 [Run] Filen.. 2021. 8. 30.
[Delphi] 프로그램 활성화하기 // --------------------------------------------// 파일이 실행상태가 아니면 실행하기// 최소화 상태면 활성화시키기// 다른 창 아래에 가려졌으면 맨 앞으로 가져오기// --------------------------------------------procedure test;begin h := WindowFromProcessID(getProcessId('실행파일명.exe')); // h := FindWindow('TFormName', nil); if h = 0 then ShellExecute(handle, 'open', PChar(FileName), nil, nil, SW_SHOW) else if IsIconic(h) then ShowWindow(h, SW_RESTO.. 2020. 8. 7.
[Delphi] ComPort 오류 수정 // 델파이 xe 등에서 한글 깨질때 string -> AnsiString 변경 function WriteStr(Str: AnsiString): Integer; function WriteStrAsync(var Str: AnsiString; var AsyncPtr: PAsync): Integer; // INFINITE는 작업 종료까지 무한대 기다리기 때문에 수정 function TCustomComPort.WaitForAsync(var AsyncPtr: PAsync): Integer; // Signaled := WaitForSingleObject(AsyncPtr^.Overlapped.hEvent, INFINITE); Signaled := WaitForSingleObject(AsyncPtr^.Overlappe.. 2020. 8. 3.
[Delphi] 기본 프린터 설정 및 정보 가져오기 type TPrinterInfo = record SeverName: PChar; PrinterName: PChar; ShareName: PChar; PortName: PChar; DriverName: PChar; Comment: PChar; Location: PChar; DeviceMode: PDeviceModeW; SepFile: PChar; PrintProcessor: PChar; DataType: PChar; Parameters: PChar; SecurityDescriptor: PSecurityDescriptor; Attributes: Cardinal; DefaultPriority: Cardinal; StartTime: Cardinal; UntilTime: Cardinal; Status: Cardi.. 2020. 5. 28.
[Delphi] TStringlist를 OleVariant로 변환하기 function StreamToVariant(Stream: TStream): OleVariant; var p: Pointer; begin Result := VarArrayCreate([0, Stream.Size - 1], varByte); p := VarArrayLock(Result); try Stream.Position := 0; Stream.Read(p^, Stream.Size); finally VarArrayUnlock(Result); end; end; function StringlistToVariant(aStrlist: TStrings): OleVariant; var hStream: TStream; begin hStream := TMemoryStream.Create; try aStrlist.Sav.. 2019. 6. 14.
[Delphi] Webbrowser html 가져오기 방법1) WB.OleObject.Document.documentElement.outerHTML; 방법2) function GetHTML: String; Var E: IHTMLElement; begin result := ''; if Assigned(WB.Document) then begin E := (WB.Document as IHTMLDocument2).body; while E.parentElement nil do begin E := E.parentElement; end; result := E.outerHTML; end; end; 2019. 6. 14.
[Delphi] 중국어 번체<->간체 function StrConv(const sText: String; Conversion: DWORD): String; overload; var nSize: Integer; begin nSize := LCMapString(LOCALE_SYSTEM_DEFAULT, Conversion, PChar(sText), Length(sText), nil, 0); SetLength(Result, nSize); nSize := LCMapString(LOCALE_SYSTEM_DEFAULT, Conversion, PChar(sText), Length(sText), PChar(Result), nSize); if nSize 2019. 6. 14.
[Delphi] 듀얼모니터에 폼 띄우기 Form1 := TForm1.Create(nil);Form1.Top := screen.monitors[0].Top;Form1.Left := screen.monitors[0].Left;Form1.DefaultMonitor := dmDesktop; // 이거 못찾아서 삽질 한참했네 ㅠㅠForm1.Show; 그냥 Left값 지정한다고 되는게 아니라 dmDesktop 이거 해줘야 함! 2018. 1. 9.